[英]Why is my Saga blocking access to the event handlers?
我正在嘗試在NServiceBus中進行傳奇。 我有以下幾點:
public class MyProcessor: Saga<MySaga>, IAmStartedByMessages<MyMessage1>,
IAmStartedByMessages<MyMessage2>, IHandleTimeouts<MyTimeout>
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MySaga> mapper) {
mapper.ConfigureMapping<MyMessage1>(m => m.Id).ToSaga(s => s.Id);
mapper.ConfigureMapping<MyMessage2>(m => m.Id).ToSaga(s => s.Id);
}
public void Handle(MyMessage1 message) {
// logic
RequestTimeout<MyTimeout>(TimeSpan.FromMinutes(30));
}
public void Handle(MyMessage2 message) {
// logic
MarkAsComplete();
}
public void Timeout(MyTimeout state) {
// logic
MarkAsComplete();
}
因此,該體系結構使得Message1
應該首先出現,但是在超時之后,我們放棄等待Message2
。 但是,如果Message2
確實在超時后進入,則仍然可以,因此將這兩個消息都標記為IAmStartedByMessages
。 現在的問題是這樣的:如果我要發布Message2
,那么代碼將運行,傳奇故事已經完成,並且我可以繼續發布更多事件。 但是,如果我首先運行Message1
處理程序,它將阻塞整個處理器,那么我將無法再發布Message1
和Message2
。 發生這種阻塞的原因是什么?
我正在使用InMemoryPersistence
進行開發。
問題是我沒有意識到需要在Handler
設置與配置相關的Data
。 我認為這是由ConfigureHowToFindSaga
自動處理的。 因此,在我的Message1
處理程序中,我只需要以下代碼:
Data.Id = message.Id;
通過這種方式,創建了具有適當ID集的鼠尾草,然后下次我們訪問它時,它實際上就存在了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.