2017-09-20 44 views
0

我們使用NserviceBus作爲我們的信息基礎設施,使用RabbitMQ作爲傳輸。 我試圖從5. *版本升級到NServiceBus 6.0。在5.0中,我們可以使用「Bus.Defer()」推遲事件。但它似乎在6.0中,我們可以推遲只有消息,但不是事件?如何推遲NServiceBus 6.0中的事件?

如果我在下面的代碼中使用消息是一個「事件」,我會收到一個錯誤消息,說應該發佈事件。

 var sendOptions = new SendOptions(); 
     sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30)); 
     sendOptions.RouteToThisEndpoint(); 
     return context.Send(message, sendOptions); 

context.Publish(消息,新PublishOptions())方法採用在 「PublishOptions」 不具有一個選項,以推遲。

我在這裏錯過了什麼嗎?感謝有人能幫助。

+0

事件是基於已經發生了,不是你需要推遲行動的東西達到相同的。如果你需要推遲一個行動,那麼也許它應該是一個命令?沒有更廣泛的問題範圍,很難說。你能從流程的角度添加一些你正在做的事情的細節嗎? –

+0

有一個產品創作系統,在產品數據發生變化時發佈事件。我們是訂戶,當產品數據發生變化時,我們將不得不更新我們的系統。有些變化不會立即生效,所以我們將不得不推遲其中的一些事件。例如,一個事件可能看起來像這樣。 2017年9月22日 的事實,即產品的更新是一個事件或消息或命令總是有爭議的,但我不能將其更改爲消息或命令,因爲這是造成其他問題。 –

回答

0

我在另一個論壇有答案,我認爲這是最相關的,所以張貼在這裏,以便它可以幫助未來的人。由於丹尼爾馬爾巴赫

https://groups.google.com/forum/#!topic/particularsoftware/ivy1wdsycT8

Bus.Defer在V5在內部總是在做一個發送操作。看起來與v6的區別在於它會自動禁用消息傳遞最佳實踐。你可以通過調用

 var sendOptions = new SendOptions(); 
     sendOptions.DoNotDeliverBefore(DateTimeOffset.Now.AddMinutes(30)); 
     sendOptions.RouteToThisEndpoint(); 
     sendOptions.DoNotEnforceBestPractices(); 
     return context.Send(message, sendOptions); 

https://docs.particular.net/nservicebus/messaging/best-practice-enforcement

1

有些更改不會立即生效,所以我們將不得不延遲其中一些事件。

發佈者不應受到任何訂戶的限制。

假設產品創作系統發佈ProductDataUpdate事件是否正確,無論實際生效日期何時發生?在這種情況下,您已經通知作出的決定。作爲訂閱者,你是做什麼的,是完全不同的內容。

如果EffectiveDate在未來,您可以發送一條命令,爲了討論起見,將它命名爲UpdateProductCost,如果是EffectiveDate,那麼這將是延遲的消息。否則,這是一個直接的命令。

+0

我同意你的看法,肖恩,你說得對。如果時間允許,我可能會這樣做,以便遵循NserviceBus強制執行的最佳做法。但現在,我正在尋找一個快速的選擇。感謝您的建議。 –