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
ede3fb7e
authored
Mar 10, 2020
by
dingsongjie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善接口
parent
6c72dd71
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
61 additions
and
31 deletions
src/Pole.Sagas.Server/Services/SagaService.cs
src/Pole.Sagas.Storage.PostgreSql/PostgreSqlSagaStorage.cs
src/Pole.Sagas/Core/Abstraction/IEventSender.cs
src/Pole.Sagas/Core/EventSender.cs
src/Pole.Sagas/Core/Saga.cs
src/Pole.Sagas/Core/SagaStatus.cs
src/Pole.Sagas/Protos/saga.proto
src/Pole.Sagas.Server/Services/SagaService.cs
View file @
ede3fb7e
...
...
@@ -43,7 +43,7 @@ namespace Pole.Sagas.Server.Services
}
return
commonResponse
;
}
public
override
async
Task
<
CommonResponse
>
ActivityE
nded
(
ActivityEnd
edRequest
request
,
ServerCallContext
context
)
public
override
async
Task
<
CommonResponse
>
ActivityE
xecuted
(
ActivityExecut
edRequest
request
,
ServerCallContext
context
)
{
CommonResponse
commonResponse
=
new
CommonResponse
();
try
...
...
@@ -85,7 +85,7 @@ namespace Pole.Sagas.Server.Services
}
return
commonResponse
;
}
public
override
async
Task
<
CommonResponse
>
ActivityExecut
eStarted
(
ActivityExecuteStarted
Request
request
,
ServerCallContext
context
)
public
override
async
Task
<
CommonResponse
>
ActivityExecut
ing
(
ActivityExecuting
Request
request
,
ServerCallContext
context
)
{
CommonResponse
commonResponse
=
new
CommonResponse
();
try
...
...
src/Pole.Sagas.Storage.PostgreSql/PostgreSqlSagaStorage.cs
View file @
ede3fb7e
...
...
@@ -14,8 +14,8 @@ namespace Pole.Sagas.Storage.PostgreSql
{
private
readonly
string
sagaTableName
;
private
readonly
string
activityTableName
;
private
readonly
PoleSagasStoragePostgreSqlOption
poleSagasStoragePostgreSqlOption
;
private
readonly
ISagaStorageInitializer
sagaStorageInitializer
;
private
readonly
PoleSagasStoragePostgreSqlOption
poleSagasStoragePostgreSqlOption
;
private
readonly
ISagaStorageInitializer
sagaStorageInitializer
;
public
PostgreSqlSagaStorage
(
IOptions
<
PoleSagasStoragePostgreSqlOption
>
poleSagasStoragePostgreSqlOption
,
ISagaStorageInitializer
sagaStorageInitializer
)
{
this
.
poleSagasStoragePostgreSqlOption
=
poleSagasStoragePostgreSqlOption
.
Value
;
...
...
@@ -24,35 +24,47 @@ namespace Pole.Sagas.Storage.PostgreSql
activityTableName
=
sagaStorageInitializer
.
GetActivityTableName
();
}
public
async
Task
ActivityCompensateAborted
(
string
activityId
,
string
sagaId
,
string
errors
)
{
{
using
(
var
connection
=
new
NpgsqlConnection
(
poleSagasStoragePostgreSqlOption
.
ConnectionString
))
{
using
(
var
tansaction
=
await
connection
.
BeginTransactionAsync
())
using
(
var
tansaction
=
await
connection
.
BeginTransactionAsync
())
{
var
updateActivitySql
=
$"UPDATE
{
activityTableName
}
SET \"Status\"=@Status,\"Errors\"=@Errors WHERE \"Id\" = @Id"
;
await
connection
.
ExecuteAsync
(
updateActivitySql
,
new
{
Id
=
activityId
,
Errors
=
errors
,
Status
=
nameof
(
ActivityStatus
.
CompensateAborted
)
},
tansaction
);
var
updateSagaSql
=
$"UPDATE
{
sagaTableName
}
SET \"Status\"=@Status,\"Errors\"=@Errors WHERE \"Id\" = @Id"
;
await
connection
.
ExecuteAsync
(
updateSagaSql
,
new
await
connection
.
ExecuteAsync
(
updateActivitySql
,
new
{
Id
=
activityId
,
Errors
=
errors
,
Status
=
nameof
(
ActivityStatus
.
CompensateAborted
)
},
tansaction
);
if
(!
string
.
IsNullOrEmpty
(
sagaId
))
{
var
updateSagaSql
=
$"UPDATE
{
sagaTableName
}
SET \"Status\"=@Status,\"Errors\"=@Errors WHERE \"Id\" = @Id"
;
await
connection
.
ExecuteAsync
(
updateSagaSql
,
new
{
Id
=
sagaId
,
Status
=
nameof
(
SagaStatus
.
Error
)
},
tansaction
);
}
await
tansaction
.
CommitAsync
();
}
}
}
public
Task
ActivityCompensated
(
string
activityId
)
public
async
Task
ActivityCompensated
(
string
activityId
)
{
throw
new
NotImplementedException
();
using
(
var
connection
=
new
NpgsqlConnection
(
poleSagasStoragePostgreSqlOption
.
ConnectionString
))
{
var
updateActivitySql
=
$"UPDATE
{
activityTableName
}
SET \"Status\"=@Status WHERE \"Id\" = @Id"
;
await
connection
.
ExecuteAsync
(
updateActivitySql
,
new
{
Id
=
activityId
,
Status
=
nameof
(
ActivityStatus
.
Compensated
)
});
}
}
public
Task
ActivityEnded
(
string
activityId
,
byte
[]
resultData
)
...
...
src/Pole.Sagas/Core/Abstraction/IEventSender.cs
View file @
ede3fb7e
...
...
@@ -7,13 +7,14 @@ namespace Pole.Sagas.Core.Abstraction
{
Task
SagaStarted
(
string
sagaId
,
string
serviceName
,
DateTime
addTime
);
Task
SagaEnded
(
string
sagaId
,
DateTime
ExpiresAt
);
Task
ActivityExecut
eStarted
(
string
activityId
,
string
sagaId
,
int
timeOutSeconds
,
byte
[]
parameterData
,
int
order
,
DateTime
addTime
);
Task
ActivityExecut
ing
(
string
activityId
,
string
sagaId
,
int
timeOutSeconds
,
byte
[]
parameterData
,
int
order
,
DateTime
addTime
);
Task
ActivityRetried
(
string
activityId
,
string
status
,
int
retries
,
ActivityRetryType
retryType
);
Task
ActivityExecuteAborted
(
string
activityId
,
string
errors
);
Task
ActivityCompensateAborted
(
string
activityId
,
string
sagaId
,
string
errors
);
Task
ActivityE
nd
ed
(
string
activityId
,
byte
[]
resultData
);
Task
ActivityE
xecut
ed
(
string
activityId
,
byte
[]
resultData
);
Task
ActivityCompensated
(
string
activityId
);
Task
ActivityExecuteOvertime
(
string
activityId
,
string
sagaId
,
string
errors
);
Task
ActivityRevoked
(
string
activityId
);
Task
ActivityCompensating
(
string
activityId
);
}
}
src/Pole.Sagas/Core/EventSender.cs
View file @
ede3fb7e
...
...
@@ -43,9 +43,9 @@ namespace Pole.Sagas.Core
}
}
public
async
Task
ActivityE
nd
ed
(
string
activityId
,
byte
[]
resultData
)
public
async
Task
ActivityE
xecut
ed
(
string
activityId
,
byte
[]
resultData
)
{
var
result
=
await
sagaClient
.
ActivityE
ndedAsync
(
new
Server
.
Grpc
.
ActivityEnd
edRequest
var
result
=
await
sagaClient
.
ActivityE
xecutedAsync
(
new
Server
.
Grpc
.
ActivityExecut
edRequest
{
ActivityId
=
activityId
,
ResultData
=
Google
.
Protobuf
.
ByteString
.
CopyFrom
(
resultData
),
...
...
@@ -84,9 +84,9 @@ namespace Pole.Sagas.Core
}
}
public
async
Task
ActivityExecut
eStarted
(
string
activityId
,
string
sagaId
,
int
timeoutSeconds
,
byte
[]
parameterData
,
int
order
,
DateTime
addTime
)
public
async
Task
ActivityExecut
ing
(
string
activityId
,
string
sagaId
,
int
timeoutSeconds
,
byte
[]
parameterData
,
int
order
,
DateTime
addTime
)
{
var
result
=
await
sagaClient
.
ActivityExecut
eStartedAsync
(
new
Server
.
Grpc
.
ActivityExecuteStarted
Request
var
result
=
await
sagaClient
.
ActivityExecut
ingAsync
(
new
Server
.
Grpc
.
ActivityExecuting
Request
{
ActivityId
=
activityId
,
AddTime
=
addTime
.
ToString
(
"yyyy-MM-dd HH:mm:ss.fff"
),
...
...
@@ -153,5 +153,17 @@ namespace Pole.Sagas.Core
throw
new
SagasServerException
(
result
.
Errors
);
}
}
public
async
Task
ActivityCompensating
(
string
activityId
)
{
var
result
=
await
sagaClient
.
ActivityCompensatingAsync
(
new
Server
.
Grpc
.
ActivityCompensatingRequest
{
ActivityId
=
activityId
,
});
if
(!
result
.
IsSuccess
)
{
throw
new
SagasServerException
(
result
.
Errors
);
}
}
}
}
src/Pole.Sagas/Core/Saga.cs
View file @
ede3fb7e
...
...
@@ -119,6 +119,7 @@ namespace Pole.Sagas.Core
var
activityId
=
activityWapper
.
Id
;
try
{
await
eventSender
.
ActivityCompensating
(
activityId
);
await
activityWapper
.
InvokeCompensate
();
await
eventSender
.
ActivityCompensated
(
activityId
);
var
compensateActivity
=
GetNextCompensateActivity
();
...
...
@@ -141,7 +142,7 @@ namespace Pole.Sagas.Core
try
{
var
bytesContent
=
serializer
.
SerializeToUtf8Bytes
(
activityWapper
.
DataObj
,
activityWapper
.
ActivityDataType
);
await
eventSender
.
ActivityExecut
eStarted
(
activityId
,
Id
,
activityWapper
.
TimeOutSeconds
,
bytesContent
,
activityWapper
.
Order
,
DateTime
.
UtcNow
);
await
eventSender
.
ActivityExecut
ing
(
activityId
,
Id
,
activityWapper
.
TimeOutSeconds
,
bytesContent
,
activityWapper
.
Order
,
DateTime
.
UtcNow
);
var
result
=
await
activityWapper
.
InvokeExecute
();
if
(!
result
.
IsSuccess
)
{
...
...
@@ -149,7 +150,7 @@ namespace Pole.Sagas.Core
await
CompensateActivity
(
result
,
currentExecuteOrder
);
return
result
;
}
await
eventSender
.
ActivityE
nd
ed
(
activityId
,
Encoding
.
UTF8
.
GetBytes
(
string
.
Empty
));
await
eventSender
.
ActivityE
xecut
ed
(
activityId
,
Encoding
.
UTF8
.
GetBytes
(
string
.
Empty
));
var
executeActivity
=
GetNextExecuteActivity
();
if
(
executeActivity
==
null
)
{
...
...
src/Pole.Sagas/Core/SagaStatus.cs
View file @
ede3fb7e
...
...
@@ -4,7 +4,7 @@ using System.Text;
namespace
Pole.Sagas.Core
{
enum
SagaStatus
public
enum
SagaStatus
{
Started
,
Ended
,
...
...
src/Pole.Sagas/Protos/saga.proto
View file @
ede3fb7e
...
...
@@ -7,14 +7,15 @@ package pole.Sagas.Server.Grpc;
service
Saga
{
rpc
SagaStarted
(
SagaStartedRequest
)
returns
(
CommonResponse
);
rpc
SagaEnded
(
SagaEndedRequest
)
returns
(
CommonResponse
);
rpc
ActivityExecut
eStarted
(
ActivityExecuteStarted
Request
)
returns
(
CommonResponse
);
rpc
ActivityExecut
ing
(
ActivityExecuting
Request
)
returns
(
CommonResponse
);
rpc
ActivityRetried
(
ActivityRetriedRequest
)
returns
(
CommonResponse
);
rpc
ActivityExecuteAborted
(
ActivityExecuteAbortedRequest
)
returns
(
CommonResponse
);
rpc
ActivityCompensateAborted
(
ActivityCompensateAbortedRequest
)
returns
(
CommonResponse
);
rpc
ActivityE
nded
(
ActivityEnd
edRequest
)
returns
(
CommonResponse
);
rpc
ActivityE
xecuted
(
ActivityExecut
edRequest
)
returns
(
CommonResponse
);
rpc
ActivityCompensated
(
ActivityCompensatedRequest
)
returns
(
CommonResponse
);
rpc
ActivityExecuteOvertime
(
ActivityExecuteOvertimeRequest
)
returns
(
CommonResponse
);
rpc
ActivityRevoked
(
ActivityRevokedRequest
)
returns
(
CommonResponse
);
rpc
ActivityCompensating
(
ActivityCompensatingRequest
)
returns
(
CommonResponse
);
}
message
CommonResponse
{
...
...
@@ -31,7 +32,7 @@ message SagaEndedRequest {
string
sagaId
=
1
;
string
ExpiresAt
=
2
;
}
message
ActivityExecut
eStarted
Request
{
message
ActivityExecut
ing
Request
{
string
activityId
=
1
;
string
sagaId
=
2
;
int32
timeOutSeconds
=
3
;
...
...
@@ -58,7 +59,7 @@ message ActivityCompensateAbortedRequest {
string
sagaId
=
2
;
string
errors
=
3
;
}
message
ActivityE
nd
edRequest
{
message
ActivityE
xecut
edRequest
{
string
activityId
=
1
;
bytes
resultData
=
2
;
}
...
...
@@ -73,5 +74,8 @@ message ActivityExecuteOvertimeRequest {
message
ActivityRevokedRequest
{
string
activityId
=
1
;
}
message
ActivityCompensatingRequest
{
string
activityId
=
1
;
}
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