Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
丁松杰
/
Pole
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
021ebde6
authored
Feb 11, 2020
by
丁松杰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加 批量消息处理时的 异常重试 及错误队列
parent
65b7891d
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
34 additions
and
35 deletions
src/Pole.Core/EventBus/EventHandler/PoleEventHandler.cs
src/Pole.Core/EventBus/EventHandler/PoleEventHandlerBase.cs
src/Pole.Core/EventBus/ObserverUnit.cs
src/Pole.EventBus.Rabbitmq/Configuration/RabbitOptions.cs
src/Pole.EventBus.Rabbitmq/Consumer/ConsumerRunner.cs
src/Pole.Core/EventBus/EventHandler/PoleEventHandler.cs
View file @
021ebde6
...
...
@@ -8,7 +8,7 @@ namespace Pole.Core.EventBus.EventHandler
{
public
class
PoleEventHandler
:
PoleEventHandlerBase
{
public
override
Task
Batch
Invoke
(
Immutable
<
List
<
byte
[
]>
>
bytes
)
public
override
Task
Invoke
(
Immutable
<
List
<
byte
[
]>
>
bytes
)
{
throw
new
NotImplementedException
();
}
...
...
src/Pole.Core/EventBus/EventHandler/PoleEventHandlerBase.cs
View file @
021ebde6
...
...
@@ -10,6 +10,6 @@ namespace Pole.Core.EventBus.EventHandler
public
abstract
class
PoleEventHandlerBase
:
Grain
{
public
abstract
Task
Invoke
(
Immutable
<
byte
[
]>
bytes
);
public
abstract
Task
Batch
Invoke
(
Immutable
<
List
<
byte
[
]>
>
bytes
);
public
abstract
Task
Invoke
(
Immutable
<
List
<
byte
[
]>
>
bytes
);
}
}
src/Pole.Core/EventBus/ObserverUnit.cs
View file @
021ebde6
...
...
@@ -144,7 +144,7 @@ namespace Pole.Core.EventBus
return
Task
.
WhenAll
(
groups
.
Select
(
kv
=>
{
var
items
=
kv
.
Select
(
item
=>
item
.
bytes
).
ToList
();
return
GetObserver
(
observerType
,
kv
.
Key
).
Batch
Invoke
(
new
Immutable
<
List
<
byte
[
]>
>(
items
));
return
GetObserver
(
observerType
,
kv
.
Key
).
Invoke
(
new
Immutable
<
List
<
byte
[
]>
>(
items
));
}));
}
}
...
...
src/Pole.EventBus.Rabbitmq/Configuration/RabbitOptions.cs
View file @
021ebde6
...
...
@@ -16,7 +16,7 @@ namespace Pole.EventBus.RabbitMQ
/// <summary>
/// 消费者批量处理每次处理的最大消息量
/// </summary>
public
ushort
CunsumerMaxBatchSize
{
get
;
set
;
}
=
300
0
;
public
ushort
CunsumerMaxBatchSize
{
get
;
set
;
}
=
300
;
/// <summary>
/// 消费者批量处理每次处理的最大延时
/// </summary>
...
...
src/Pole.EventBus.Rabbitmq/Consumer/ConsumerRunner.cs
View file @
021ebde6
...
...
@@ -78,23 +78,22 @@ namespace Pole.EventBus.RabbitMQ
try
{
await
Consumer
.
Notice
(
list
.
Select
(
o
=>
o
.
Body
).
ToList
());
if
(!
Consumer
.
Config
.
AutoAck
)
{
Model
.
Model
.
BasicAck
(
list
.
Max
(
o
=>
o
.
DeliveryTag
),
true
);
}
}
catch
(
Exception
exception
)
{
Logger
.
LogError
(
exception
.
InnerException
??
exception
,
$"An error occurred in
{
Consumer
.
EventBus
.
Exchange
}
-
{
Queue
}
"
);
Logger
.
LogError
(
exception
,
$"An error occurred in batch consume
{
Queue
.
Queue
}
queue, routing path
{
Consumer
.
EventBus
.
Exchange
}
->
{
Queue
.
Queue
}
->
{
Queue
.
Queue
}
"
);
if
(
Consumer
.
Config
.
Reenqueue
)
{
await
Task
.
Delay
(
1000
);
foreach
(
var
item
in
list
)
{
Model
.
Model
.
BasicReject
(
item
.
DeliveryTag
,
true
);
await
ProcessComsumerErrors
(
item
,
exception
);
}
}
}
if
(!
Consumer
.
Config
.
AutoAck
)
{
Model
.
Model
.
BasicAck
(
list
.
Max
(
o
=>
o
.
DeliveryTag
),
true
);
}
}
}
private
async
Task
Process
(
BasicDeliverEventArgs
ea
)
...
...
@@ -105,8 +104,11 @@ namespace Pole.EventBus.RabbitMQ
}
catch
(
Exception
exception
)
{
Logger
.
LogError
(
exception
,
$"An error occurred in
{
Queue
.
Queue
}
, routing path
{
Consumer
.
EventBus
.
Exchange
}
->
{
Queue
.
Queue
}
->
{
Queue
.
Queue
}
"
);
await
ProcessComsumerErrors
(
ea
,
exception
);
Logger
.
LogError
(
exception
,
$"An error occurred in consume
{
Queue
.
Queue
}
queue, routing path
{
Consumer
.
EventBus
.
Exchange
}
->
{
Queue
.
Queue
}
->
{
Queue
.
Queue
}
"
);
if
(
Consumer
.
Config
.
Reenqueue
)
{
await
ProcessComsumerErrors
(
ea
,
exception
);
}
}
if
(!
Consumer
.
Config
.
AutoAck
)
{
...
...
@@ -116,32 +118,29 @@ namespace Pole.EventBus.RabbitMQ
private
async
Task
ProcessComsumerErrors
(
BasicDeliverEventArgs
ea
,
Exception
exception
)
{
if
(
Consumer
.
Config
.
Reenqueue
)
if
(
ea
.
BasicProperties
.
Headers
.
TryGetValue
(
Consts
.
ConsumerRetryTimesStr
,
out
object
retryTimesObj
)
)
{
if
(
ea
.
BasicProperties
.
Headers
.
TryGetValue
(
Consts
.
ConsumerRetryTimesStr
,
out
object
retryTimesObj
))
var
retryTimes
=
Convert
.
ToInt32
(
retryTimesObj
);
if
(
retryTimes
<=
Consumer
.
Config
.
MaxReenqueueTimes
)
{
var
retryTimes
=
Convert
.
ToInt32
(
retryTimesObj
);
if
(
retryTimes
<=
Consumer
.
Config
.
MaxReenqueueTimes
)
retryTimes
++;
ea
.
BasicProperties
.
Headers
[
Consts
.
ConsumerRetryTimesStr
]
=
retryTimes
;
ea
.
BasicProperties
.
Headers
[
Consts
.
ConsumerExceptionDetailsStr
]
=
serializer
.
Serialize
(
exception
,
typeof
(
Exception
));
await
Task
.
Delay
((
int
)
Math
.
Pow
(
2
,
retryTimes
)
*
1000
).
ContinueWith
((
task
)
=>
{
retryTimes
++;
ea
.
BasicProperties
.
Headers
[
Consts
.
ConsumerRetryTimesStr
]
=
retryTimes
;
ea
.
BasicProperties
.
Headers
[
Consts
.
ConsumerExceptionDetailsStr
]
=
serializer
.
Serialize
(
exception
,
typeof
(
Exception
));
await
Task
.
Delay
((
int
)
Math
.
Pow
(
2
,
retryTimes
)
*
1000
).
ContinueWith
((
task
)
=>
{
Model
.
Model
.
BasicReject
(
ea
.
DeliveryTag
,
true
);
});
}
else
Model
.
Model
.
BasicReject
(
ea
.
DeliveryTag
,
true
);
});
}
else
{
var
errorQueueName
=
$"
{
Queue
.
Queue
}{
Consumer
.
Config
.
ErrorQueueSuffix
}
"
;
var
errorExchangeName
=
$"
{
Queue
.
Queue
}{
Consumer
.
Config
.
ErrorQueueSuffix
}
"
;
Model
.
Model
.
ExchangeDeclare
(
errorExchangeName
,
"direct"
,
true
);
Model
.
Model
.
QueueDeclare
(
errorQueueName
,
true
,
false
,
false
,
null
);
Model
.
Model
.
QueueBind
(
errorQueueName
,
errorExchangeName
,
string
.
Empty
);
if
(!
Consumer
.
Config
.
AutoAck
)
{
var
errorQueueName
=
$"
{
Queue
.
Queue
}{
Consumer
.
Config
.
ErrorQueueSuffix
}
"
;
var
errorExchangeName
=
$"
{
Queue
.
Queue
}{
Consumer
.
Config
.
ErrorQueueSuffix
}
"
;
Model
.
Model
.
ExchangeDeclare
(
errorExchangeName
,
"direct"
,
true
);
Model
.
Model
.
QueueDeclare
(
errorQueueName
,
true
,
false
,
false
,
null
);
Model
.
Model
.
QueueBind
(
errorQueueName
,
errorExchangeName
,
string
.
Empty
);
if
(!
Consumer
.
Config
.
AutoAck
)
{
Model
.
Model
.
BasicAck
(
ea
.
DeliveryTag
,
false
);
}
Model
.
Model
.
BasicAck
(
ea
.
DeliveryTag
,
false
);
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment