[英]Restart a MassTransit Saga
在我的應用程序中,用戶可以觸發特定資源的更新。 發生這種情況時,將發送UpdateInitiated
事件。
MassTransit Saga 基於該事件啟動,並觸發一系列其他事件,直到它認為自己完成並最終確定。
在更新過程中,用戶可以對資源進行更改並請求新的更新。 我試圖弄清楚如何在為同一資源發送新的UpdateInitiated
事件時中止正在進行的 Saga 並創建一個新實例。
我正在考慮的兩種方法
與 ResourceId 相關。 所以最初的 Saga 也會得到第二個UpdateInitiated
事件。 但是后來我不知道如何重置傳奇(並停止偵聽與先前更新相關的事件)。
使用CorrelatedBy<Guid>
(就像我現在所做的那樣)。 這將為新的更新事件創建一個新的 Saga。 但是后來我不知道如何取消初始 Saga。
有沒有辦法在 Saga 中監聽任意事件? 比如:“監聽所有UpdatedInitiated
事件,即使它們不相關,如果有匹配ResourceId的事件,則取消當前的Saga”。
我意識到可以注冊與CorrelationId
以外的其他事物相關的事件。 在我的用例中,如果有一個新事件開始一個新的傳奇,我想中止一個正在進行的傳奇,對於相同的ResourceId
。
我所做的是這樣的:
// Listen to update initiated events for the same ResourceId
Event(() => UpdateInitiated , e => e
.CorrelateBy((instance, context) =>
instance.CurrentState != 2 &&
instance.CorrelationId != context.Message.CorrelationId &&
instance.ResourceId == context.Message.ResourceId
)
.SelectId(x => NewId.NextGuid()));
// Finalize this saga if there is a newer one for the same ResourceId
DuringAny(
When(UpdateInitiated)
.Then(context => Log.Information("Saga aborted due to newer update initiated by {correlationId}", context.Data.CorrelationId))
.Finalize());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.