Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
CAP
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
tsai
CAP
Commits
83595345
Commit
83595345
authored
Oct 13, 2017
by
Savorboard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rafactor publisher excutor.
parent
07a0ec18
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
126 additions
and
158 deletions
+126
-158
IPublishExecutor.cs
src/DotNetCore.CAP/IPublishExecutor.cs
+9
-0
IQueueExecutor.Publish.Base.cs
src/DotNetCore.CAP/IQueueExecutor.Publish.Base.cs
+7
-9
IQueueExecutor.Subscribe.cs
src/DotNetCore.CAP/IQueueExecutor.Subscribe.cs
+110
-149
No files found.
src/DotNetCore.CAP/IPublishExecutor.cs
0 → 100644
View file @
83595345
using
System.Threading.Tasks
;
namespace
DotNetCore.CAP
{
public
interface
IPublishExecutor
{
Task
<
OperateResult
>
PublishAsync
(
string
keyName
,
string
content
);
}
}
src/DotNetCore.CAP/IQueueExecutor.Publish.Base.cs
View file @
83595345
using
System
;
using
System
;
using
System.Diagnostics
;
using
System.Diagnostics
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
DotNetCore.CAP.Infrastructure
;
using
DotNetCore.CAP.Models
;
using
DotNetCore.CAP.Models
;
using
DotNetCore.CAP.Processor
;
using
DotNetCore.CAP.Processor
;
using
DotNetCore.CAP.Processor.States
;
using
DotNetCore.CAP.Processor.States
;
...
@@ -8,7 +9,7 @@ using Microsoft.Extensions.Logging;
...
@@ -8,7 +9,7 @@ using Microsoft.Extensions.Logging;
namespace
DotNetCore.CAP
namespace
DotNetCore.CAP
{
{
public
abstract
class
BasePublishQueueExecutor
:
IQueueExecutor
public
abstract
class
BasePublishQueueExecutor
:
IQueueExecutor
,
IPublishExecutor
{
{
private
readonly
ILogger
_logger
;
private
readonly
ILogger
_logger
;
private
readonly
CapOptions
_options
;
private
readonly
CapOptions
_options
;
...
@@ -40,7 +41,7 @@ namespace DotNetCore.CAP
...
@@ -40,7 +41,7 @@ namespace DotNetCore.CAP
IState
newState
;
IState
newState
;
if
(!
result
.
Succeeded
)
if
(!
result
.
Succeeded
)
{
{
var
shouldRetry
=
await
UpdateMessageForRetryAsync
(
message
,
connection
);
var
shouldRetry
=
UpdateMessageForRetryAsync
(
message
);
if
(
shouldRetry
)
if
(
shouldRetry
)
{
{
newState
=
new
ScheduledState
();
newState
=
new
ScheduledState
();
...
@@ -51,6 +52,7 @@ namespace DotNetCore.CAP
...
@@ -51,6 +52,7 @@ namespace DotNetCore.CAP
newState
=
new
FailedState
();
newState
=
new
FailedState
();
_logger
.
JobFailed
(
result
.
Exception
);
_logger
.
JobFailed
(
result
.
Exception
);
}
}
message
.
Content
=
Helper
.
AddExceptionProperty
(
message
.
Content
,
result
.
Exception
);
}
}
else
else
{
{
...
@@ -67,6 +69,7 @@ namespace DotNetCore.CAP
...
@@ -67,6 +69,7 @@ namespace DotNetCore.CAP
}
}
catch
(
Exception
ex
)
catch
(
Exception
ex
)
{
{
fetched
.
Requeue
();
_logger
.
ExceptionOccuredWhileExecutingJob
(
message
?.
Name
,
ex
);
_logger
.
ExceptionOccuredWhileExecutingJob
(
message
?.
Name
,
ex
);
return
OperateResult
.
Failed
(
ex
);
return
OperateResult
.
Failed
(
ex
);
}
}
...
@@ -74,8 +77,7 @@ namespace DotNetCore.CAP
...
@@ -74,8 +77,7 @@ namespace DotNetCore.CAP
public
abstract
Task
<
OperateResult
>
PublishAsync
(
string
keyName
,
string
content
);
public
abstract
Task
<
OperateResult
>
PublishAsync
(
string
keyName
,
string
content
);
private
static
async
Task
<
bool
>
UpdateMessageForRetryAsync
(
CapPublishedMessage
message
,
private
static
bool
UpdateMessageForRetryAsync
(
CapPublishedMessage
message
)
IStorageConnection
connection
)
{
{
var
retryBehavior
=
RetryBehavior
.
DefaultRetry
;
var
retryBehavior
=
RetryBehavior
.
DefaultRetry
;
...
@@ -85,11 +87,7 @@ namespace DotNetCore.CAP
...
@@ -85,11 +87,7 @@ namespace DotNetCore.CAP
var
due
=
message
.
Added
.
AddSeconds
(
retryBehavior
.
RetryIn
(
retries
));
var
due
=
message
.
Added
.
AddSeconds
(
retryBehavior
.
RetryIn
(
retries
));
message
.
ExpiresAt
=
due
;
message
.
ExpiresAt
=
due
;
using
(
var
transaction
=
connection
.
CreateTransaction
())
{
transaction
.
UpdateMessage
(
message
);
await
transaction
.
CommitAsync
();
}
return
true
;
return
true
;
}
}
}
}
...
...
src/DotNetCore.CAP/IQueueExecutor.Subscribe.cs
View file @
83595345
using
System
;
using
System
;
using
System.Collections.Generic
;
using
System.Diagnostics
;
using
System.Diagnostics
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
DotNetCore.CAP.Abstractions
;
using
DotNetCore.CAP.Infrastructure
;
using
DotNetCore.CAP.Infrastructure
;
using
DotNetCore.CAP.Internal
;
using
DotNetCore.CAP.Internal
;
using
DotNetCore.CAP.Models
;
using
DotNetCore.CAP.Models
;
...
@@ -12,151 +10,114 @@ using Microsoft.Extensions.Logging;
...
@@ -12,151 +10,114 @@ using Microsoft.Extensions.Logging;
namespace
DotNetCore.CAP
namespace
DotNetCore.CAP
{
{
public
class
SubscribeQueueExecutor
:
IQueueExecutor
public
class
SubscribeQueueExecutor
:
IQueueExecutor
{
{
private
readonly
IConsumerInvokerFactory
_consumerInvokerFactory
;
private
readonly
ILogger
_logger
;
private
readonly
ILogger
_logger
;
private
readonly
CapOptions
_options
;
private
readonly
CapOptions
_options
;
private
readonly
IStateChanger
_stateChanger
;
private
readonly
MethodMatcherCache
_selector
;
private
readonly
ISubscriberExecutor
_subscriberExecutor
;
private
readonly
IStateChanger
_stateChanger
;
public
SubscribeQueueExecutor
(
public
SubscribeQueueExecutor
(
CapOptions
options
,
IStateChanger
stateChanger
,
IStateChanger
stateChanger
,
MethodMatcherCache
selector
,
ISubscriberExecutor
subscriberExecutor
,
CapOptions
options
,
ILogger
<
SubscribeQueueExecutor
>
logger
)
IConsumerInvokerFactory
consumerInvokerFactory
,
{
ILogger
<
BasePublishQueueExecutor
>
logger
)
_options
=
options
;
{
_subscriberExecutor
=
subscriberExecutor
;
_selector
=
selector
;
_stateChanger
=
stateChanger
;
_options
=
options
;
_logger
=
logger
;
_consumerInvokerFactory
=
consumerInvokerFactory
;
}
_stateChanger
=
stateChanger
;
_logger
=
logger
;
public
async
Task
<
OperateResult
>
ExecuteAsync
(
IStorageConnection
connection
,
IFetchedMessage
fetched
)
}
{
var
message
=
await
connection
.
GetReceivedMessageAsync
(
fetched
.
MessageId
);
public
async
Task
<
OperateResult
>
ExecuteAsync
(
IStorageConnection
connection
,
IFetchedMessage
fetched
)
try
{
{
//return await Task.FromResult(OperateResult.Success);
var
sp
=
Stopwatch
.
StartNew
();
var
message
=
await
connection
.
GetReceivedMessageAsync
(
fetched
.
MessageId
);
await
_stateChanger
.
ChangeStateAsync
(
message
,
new
ProcessingState
(),
connection
);
try
{
if
(
message
.
Retries
>
0
)
var
sp
=
Stopwatch
.
StartNew
();
_logger
.
JobRetrying
(
message
.
Retries
);
await
_stateChanger
.
ChangeStateAsync
(
message
,
new
ProcessingState
(),
connection
);
var
result
=
await
_subscriberExecutor
.
ExecuteAsync
(
message
);
if
(
message
.
Retries
>
0
)
sp
.
Stop
();
_logger
.
JobRetrying
(
message
.
Retries
);
var
result
=
await
ExecuteSubscribeAsync
(
message
);
var
state
=
GetNewState
(
result
,
message
);
sp
.
Stop
();
await
_stateChanger
.
ChangeStateAsync
(
message
,
state
,
connection
);
IState
newState
;
if
(!
result
.
Succeeded
)
fetched
.
RemoveFromQueue
();
{
var
shouldRetry
=
await
UpdateMessageForRetryAsync
(
message
,
connection
,
result
.
Exception
?.
Message
);
if
(
result
.
Succeeded
)
if
(
shouldRetry
)
_logger
.
JobExecuted
(
sp
.
Elapsed
.
TotalSeconds
);
{
newState
=
new
ScheduledState
();
return
OperateResult
.
Success
;
_logger
.
JobFailedWillRetry
(
result
.
Exception
);
}
}
catch
(
SubscriberNotFoundException
ex
)
else
{
{
_logger
.
LogError
(
ex
.
Message
);
newState
=
new
FailedState
();
_logger
.
JobFailed
(
result
.
Exception
);
AddErrorReasonToContent
(
message
,
ex
);
}
}
await
_stateChanger
.
ChangeStateAsync
(
message
,
new
FailedState
(),
connection
);
else
{
fetched
.
RemoveFromQueue
();
newState
=
new
SucceededState
(
_options
.
SucceedMessageExpiredAfter
);
}
return
OperateResult
.
Failed
(
ex
);
await
_stateChanger
.
ChangeStateAsync
(
message
,
newState
,
connection
);
}
catch
(
Exception
ex
)
fetched
.
RemoveFromQueue
();
{
_logger
.
ExceptionOccuredWhileExecutingJob
(
message
?.
Name
,
ex
);
if
(
result
.
Succeeded
)
_logger
.
JobExecuted
(
sp
.
Elapsed
.
TotalSeconds
);
fetched
.
Requeue
();
return
OperateResult
.
Success
;
return
OperateResult
.
Failed
(
ex
);
}
}
catch
(
SubscriberNotFoundException
ex
)
}
{
_logger
.
LogError
(
ex
.
Message
);
private
IState
GetNewState
(
OperateResult
result
,
CapReceivedMessage
message
)
{
await
AddErrorReasonToContent
(
message
,
ex
.
Message
,
connection
);
IState
newState
;
if
(!
result
.
Succeeded
)
await
_stateChanger
.
ChangeStateAsync
(
message
,
new
FailedState
(),
connection
);
{
var
shouldRetry
=
UpdateMessageForRetryAsync
(
message
);
fetched
.
RemoveFromQueue
();
if
(
shouldRetry
)
{
return
OperateResult
.
Failed
(
ex
);
newState
=
new
ScheduledState
();
}
_logger
.
JobFailedWillRetry
(
result
.
Exception
);
catch
(
Exception
ex
)
}
{
else
_logger
.
ExceptionOccuredWhileExecutingJob
(
message
?.
Name
,
ex
);
{
newState
=
new
FailedState
();
fetched
.
Requeue
();
_logger
.
JobFailed
(
result
.
Exception
);
}
return
OperateResult
.
Failed
(
ex
);
AddErrorReasonToContent
(
message
,
result
.
Exception
);
}
}
}
else
{
protected
virtual
async
Task
<
OperateResult
>
ExecuteSubscribeAsync
(
CapReceivedMessage
receivedMessage
)
newState
=
new
SucceededState
(
_options
.
SucceedMessageExpiredAfter
);
{
}
try
return
newState
;
{
}
var
executeDescriptorGroup
=
_selector
.
GetTopicExector
(
receivedMessage
.
Name
);
private
static
bool
UpdateMessageForRetryAsync
(
CapReceivedMessage
message
)
if
(!
executeDescriptorGroup
.
ContainsKey
(
receivedMessage
.
Group
))
{
{
var
retryBehavior
=
RetryBehavior
.
DefaultRetry
;
var
error
=
$"Topic:
{
receivedMessage
.
Name
}
, can not be found subscriber method."
;
throw
new
SubscriberNotFoundException
(
error
);
var
retries
=
++
message
.
Retries
;
}
if
(
retries
>=
retryBehavior
.
RetryCount
)
return
false
;
// If there are multiple consumers in the same group, we will take the first
var
executeDescriptor
=
executeDescriptorGroup
[
receivedMessage
.
Group
][
0
];
var
due
=
message
.
Added
.
AddSeconds
(
retryBehavior
.
RetryIn
(
retries
));
var
consumerContext
=
new
ConsumerContext
(
executeDescriptor
,
receivedMessage
.
ToMessageContext
());
message
.
ExpiresAt
=
due
;
await
_consumerInvokerFactory
.
CreateInvoker
(
consumerContext
).
InvokeAsync
();
return
true
;
}
return
OperateResult
.
Success
;
}
private
static
void
AddErrorReasonToContent
(
CapReceivedMessage
message
,
Exception
exception
)
catch
(
Exception
ex
)
{
{
message
.
Content
=
Helper
.
AddExceptionProperty
(
message
.
Content
,
exception
);
_logger
.
ConsumerMethodExecutingFailed
(
$"Group:
{
receivedMessage
.
Group
}
, Topic:
{
receivedMessage
.
Name
}
"
,
}
ex
);
}
return
OperateResult
.
Failed
(
ex
);
}
}
private
static
async
Task
<
bool
>
UpdateMessageForRetryAsync
(
CapReceivedMessage
message
,
IStorageConnection
connection
,
string
exceptionMessage
)
{
var
retryBehavior
=
RetryBehavior
.
DefaultRetry
;
var
retries
=
++
message
.
Retries
;
if
(
retries
>=
retryBehavior
.
RetryCount
)
return
false
;
var
due
=
message
.
Added
.
AddSeconds
(
retryBehavior
.
RetryIn
(
retries
));
message
.
ExpiresAt
=
due
;
await
AddErrorReasonToContent
(
message
,
exceptionMessage
,
connection
);
return
true
;
}
public
static
Task
AddErrorReasonToContent
(
CapReceivedMessage
message
,
string
description
,
IStorageConnection
connection
)
{
var
exceptions
=
new
List
<
KeyValuePair
<
string
,
string
>>
{
new
KeyValuePair
<
string
,
string
>(
"ExceptionMessage"
,
description
)
};
message
.
Content
=
Helper
.
AddJsonProperty
(
message
.
Content
,
exceptions
);
using
(
var
transaction
=
connection
.
CreateTransaction
())
{
transaction
.
UpdateMessage
(
message
);
transaction
.
CommitAsync
();
}
return
Task
.
CompletedTask
;
}
}
}
}
\ No newline at end of file
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