簡體   English   中英

重新啟動 MassTransit Saga

[英]Restart a MassTransit Saga

在我的應用程序中,用戶可以觸發特定資源的更新。 發生這種情況時,將發送UpdateInitiated事件。

MassTransit Saga 基於該事件啟動,並觸發一系列其他事件,直到它認為自己完成並最終確定。

在更新過程中,用戶可以對資源進行更改並請求新的更新。 我試圖弄清楚如何在為同一資源發送新的UpdateInitiated事件時中止正在進行的 Saga 並創建一個新實例。

我正在考慮的兩種方法

  1. 與 ResourceId 相關。 所以最初的 Saga 也會得到第二個UpdateInitiated事件。 但是后來我不知道如何重置傳奇(並停止偵聽與先前更新相關的事件)。

  2. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM