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
d0e3d7c6
authored
Feb 13, 2020
by
丁松杰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
事件发布流程添加 本地事务表保证
parent
27593c6c
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
4 deletions
src/Pole.Core/EventBus/Bus.cs
src/Pole.Core/EventBus/EventStorage/EventEntity.cs
src/Pole.EventStorage.PostgreSql/PostgreSqlEventStorage.cs
src/Pole.Core/EventBus/Bus.cs
View file @
d0e3d7c6
using
Pole.Core.Abstraction
;
using
Pole.Core.EventBus.Event
;
using
Pole.Core.EventBus.EventStorage
;
using
Pole.Core.EventBus.Transaction
;
using
Pole.Core.Serialization
;
using
Pole.Core.Utils.Abstraction
;
...
...
@@ -17,25 +18,55 @@ namespace Pole.Core.EventBus
private
readonly
IEventTypeFinder
eventTypeFinder
;
private
readonly
ISerializer
serializer
;
private
readonly
ISnowflakeIdGenerator
snowflakeIdGenerator
;
private
readonly
IEventStorage
eventStorage
;
public
IDbTransactionAdapter
Transaction
{
get
;
set
;
}
public
IServiceProvider
ServiceProvider
{
get
;
}
public
Bus
(
IServiceProvider
serviceProvider
,
IProducer
producer
,
IEventTypeFinder
eventTypeFinder
,
ISerializer
serializer
,
ISnowflakeIdGenerator
snowflakeIdGenerator
)
public
Bus
(
IServiceProvider
serviceProvider
,
IProducer
producer
,
IEventTypeFinder
eventTypeFinder
,
ISerializer
serializer
,
ISnowflakeIdGenerator
snowflakeIdGenerator
,
IEventStorage
eventStorage
)
{
ServiceProvider
=
serviceProvider
;
this
.
producer
=
producer
;
this
.
eventTypeFinder
=
eventTypeFinder
;
this
.
serializer
=
serializer
;
this
.
snowflakeIdGenerator
=
snowflakeIdGenerator
;
this
.
eventStorage
=
eventStorage
;
}
public
async
Task
<
bool
>
Publish
(
object
@event
,
CancellationToken
cancellationToken
=
default
)
{
var
eventType
=
@event
.
GetType
();
var
eventTypeCode
=
eventTypeFinder
.
GetCode
(
eventType
);
var
eventId
=
snowflakeIdGenerator
.
NextId
();
var
bytesTransport
=
new
EventBytesTransport
(
eventTypeCode
,
eventId
,
serializer
.
SerializeToUtf8Bytes
(
@event
,
eventType
));
var
eventContentBytes
=
serializer
.
SerializeToUtf8Bytes
(
@event
,
eventType
);
var
eventContent
=
serializer
.
Serialize
(
@event
,
eventType
);
var
bytesTransport
=
new
EventBytesTransport
(
eventTypeCode
,
eventId
,
eventContentBytes
);
var
bytes
=
bytesTransport
.
GetBytes
();
var
eventEntity
=
new
EventEntity
{
Added
=
DateTime
.
UtcNow
,
Content
=
eventContent
,
ExpiresAt
=
null
,
Id
=
eventId
,
Name
=
eventTypeCode
,
Retries
=
0
,
StatusName
=
nameof
(
EventStatus
.
PrePublish
)
};
if
(
Transaction
?.
DbTransaction
==
null
)
{
var
mediumMessage
=
await
eventStorage
.
StoreMessage
(
eventEntity
);
}
else
{
var
transaction
=
(
IDbTransactionAdapter
)
Transaction
;
var
mediumMessage
=
eventStorage
.
StoreMessage
(
eventEntity
,
transaction
.
DbTransaction
);
if
(
transaction
.
AutoCommit
)
{
await
transaction
.
CommitAsync
();
}
}
await
producer
.
Publish
(
bytes
);
return
true
;
}
...
...
src/Pole.Core/EventBus/EventStorage/EventEntity.cs
View file @
d0e3d7c6
...
...
@@ -10,7 +10,7 @@ namespace Pole.Core.EventBus.EventStorage
public
string
Name
{
get
;
set
;
}
public
string
Content
{
get
;
set
;
}
public
DateTime
Added
{
get
;
set
;
}
public
DateTime
ExpiresAt
{
get
;
set
;
}
public
DateTime
?
ExpiresAt
{
get
;
set
;
}
public
int
Retries
{
get
;
set
;
}
public
string
StatusName
{
get
;
set
;
}
}
...
...
src/Pole.EventStorage.PostgreSql/PostgreSqlEventStorage.cs
View file @
d0e3d7c6
...
...
@@ -51,7 +51,7 @@ namespace Pole.EventStorage.PostgreSql
public
async
Task
<
IEnumerable
<
EventEntity
>>
GetPublishedMessagesOfNeedRetry
()
{
var
fourMinAgo
=
DateTime
.
Now
.
AddMinutes
(-
4
).
ToString
(
"O"
);
var
fourMinAgo
=
DateTime
.
Utc
Now
.
AddMinutes
(-
4
).
ToString
(
"O"
);
var
sql
=
$"SELECT * FROM
{
tableName
}
WHERE \"Retries\"<
{
producerOptions
.
FailedRetryCount
}
AND \"Added\"<'
{
fourMinAgo
}
' AND (\"StatusName\"='
{
EventStatus
.
Failed
}
' OR \"StatusName\"='
{
EventStatus
.
PrePublish
}
') LIMIT 200;"
;
...
...
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