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
dc62bcb8
authored
Mar 12, 2020
by
dingsongjie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成所有逻辑
parent
7ef7a1a7
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
44 additions
and
22 deletions
src/Pole.Sagas.Client/NotEndedSagasCompensateRetryBackgroundService.cs
src/Pole.Sagas.Client/Saga.cs
src/Pole.Sagas.Client/NotEndedSagasCompensateRetryBackgroundService.cs
View file @
dc62bcb8
using
Grpc.Core
;
using
Microsoft.Extensions.DependencyInjection
;
using
Microsoft.Extensions.Hosting
;
using
Microsoft.Extensions.Logging
;
using
Microsoft.Extensions.Options
;
using
Pole.Core.Serialization
;
using
Pole.Core.Utils.Abstraction
;
...
...
@@ -21,11 +22,15 @@ namespace Pole.Sagas.Client
private
readonly
PoleSagasOption
options
;
private
readonly
SagaClient
sagaClient
;
private
readonly
SagaRestorer
sagaRestorer
;
public
NotEndedSagasCompensateRetryBackgroundService
(
IOptions
<
PoleSagasOption
>
options
,
SagaClient
sagaClient
,
IServiceProvider
serviceProvider
)
private
readonly
IEventSender
eventSender
;
private
readonly
ILogger
logger
;
public
NotEndedSagasCompensateRetryBackgroundService
(
IOptions
<
PoleSagasOption
>
options
,
SagaClient
sagaClient
,
IServiceProvider
serviceProvider
,
IEventSender
eventSender
,
ILogger
logger
)
{
this
.
options
=
options
.
Value
;
this
.
sagaClient
=
sagaClient
;
sagaRestorer
=
new
SagaRestorer
(
serviceProvider
.
GetRequiredService
<
ISnowflakeIdGenerator
>(),
serviceProvider
,
serviceProvider
.
GetRequiredService
<
IEventSender
>(),
this
.
options
,
serviceProvider
.
GetRequiredService
<
ISerializer
>(),
serviceProvider
.
GetRequiredService
<
IActivityFinder
>());
this
.
eventSender
=
eventSender
;
this
.
logger
=
logger
;
}
public
async
Task
StartAsync
(
CancellationToken
cancellationToken
)
...
...
@@ -36,30 +41,43 @@ namespace Pole.Sagas.Client
{
if
(
stream
.
ResponseStream
.
Current
.
IsSuccess
)
{
var
sagas
=
stream
.
ResponseStream
.
Current
.
Sagas
.
Select
(
m
=>
try
{
var
result
=
new
SagaEntity
var
sagas
=
stream
.
ResponseStream
.
Current
.
Sagas
.
Select
(
m
=>
{
Id
=
m
.
Id
,
};
result
.
ActivityEntities
=
m
.
Activities
.
Select
(
n
=>
new
ActivityEntity
{
CompensateTimes
=
n
.
CompensateTimes
,
ExecuteTimes
=
n
.
ExecuteTimes
,
Id
=
n
.
Id
,
Name
=
n
.
Id
,
Order
=
n
.
Order
,
ParameterData
=
n
.
ParameterData
.
ToByteArray
(),
SagaId
=
n
.
SagaId
,
Status
=
n
.
Status
var
result
=
new
SagaEntity
{
Id
=
m
.
Id
,
};
result
.
ActivityEntities
=
m
.
Activities
.
Select
(
n
=>
new
ActivityEntity
{
CompensateTimes
=
n
.
CompensateTimes
,
ExecuteTimes
=
n
.
ExecuteTimes
,
Id
=
n
.
Id
,
Name
=
n
.
Id
,
Order
=
n
.
Order
,
ParameterData
=
n
.
ParameterData
.
ToByteArray
(),
SagaId
=
n
.
SagaId
,
Status
=
n
.
Status
}).
ToList
();
return
result
;
}).
ToList
();
return
result
;
}).
ToList
();
sagas
.
ForEach
(
async
sagaEntity
=>
{
var
saga
=
sagaRestorer
.
CreateSaga
(
sagaEntity
);
await
saga
.
CompensateWhenRetry
();
});
sagas
.
ForEach
(
async
sagaEntity
=>
{
var
saga
=
sagaRestorer
.
CreateSaga
(
sagaEntity
);
var
compensateResult
=
await
saga
.
CompensateWhenRetry
();
if
(
compensateResult
)
{
var
expiresAt
=
DateTime
.
UtcNow
.
AddSeconds
(
options
.
CompeletedSagaExpiredAfterSeconds
);
await
eventSender
.
SagaEnded
(
sagaEntity
.
Id
,
expiresAt
);
}
});
}
catch
(
Exception
ex
)
{
logger
.
LogError
(
ex
,
"Errors in NotEndedSagasCompensateRetryBackgroundService CompensateRetry"
);
}
}
}
//await foreach (var getSagasResponse in stream.ResponseStream.ReadAllAsync(cancellationToken))
...
...
src/Pole.Sagas.Client/Saga.cs
View file @
dc62bcb8
...
...
@@ -131,6 +131,10 @@ namespace Pole.Sagas.Client
return
true
;
}
await
RecursiveCompensateActivity
(
compensateActivity
);
if
(
activities
.
Any
(
m
=>
m
.
ActivityStatus
!=
ActivityStatus
.
Compensated
||
m
.
ActivityStatus
!=
ActivityStatus
.
CompensateAborted
))
{
return
false
;
}
return
true
;
}
...
...
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