2011-10-10 55 views
5

比方說,我想有一個事件產生的傳奇,然後坐着等待幾個小時,如果什麼都沒有發生,發出一些命令。基於時間的薩加斯與事件採購

現在,如果這個佐賀是所有內存中,我不得不重新啓動應用程序/服務器,傳奇將被卸載,再也沒有看到,對吧?

一旦系統恢復在線狀態,我會使用事件採購來使這個佐賀加快速度嗎?

如果是這樣,我將需要幾乎一個單獨的事件存儲與「主動傳奇」,可以在系統啓動時重播,以使我的Sagas加快速度。到目前爲止,對我來說似乎很好,但我將如何執行超時?

我需要某種方式來「重做」重播時的超時時間,考慮到可能會有幾個隨後的超時時間取決於進入傳奇的事件。

回答

6

實現此功能的最佳方法是使用另一個端點,該端點能夠在某個時間點將消息返回給您。例如,您的傳奇可能會向該「超時管理員」發送消息,並說在1小時或1天甚至1年後喚醒我。該消息將在那時返回給您。理想情況下,此消息具有會引起行動發生的商業含義。

也許最好的例子就是客戶註冊,如果客戶在註冊後的7天內沒有確認他們的賬戶,你會通過電子郵件通知他們。 「超時消息」實際上是:RemindUserToConfirmAccountMessage。當該消息在7天后被傳奇接收到時,該傳奇將基於其當前狀態來確定,如果該消息需要被處理並且需要發送客戶電子郵件。但是,如果用戶已經確認他/她的賬戶,則可以放棄該消息而不採取任何行動。

+0

我該如何製作7天的傳奇?我相信它必須堅持服務重啓的情況下,對吧? –

+1

@MauroDestro當使用事件採購時,您並不需要將自己的傳奇留在記憶中。把事件想象成一個實體,你可以在它應該處理一個事件之前重播。比較一下如何在應該處理命令之前重播聚合。使用喬納森的方法來處理超時(使他們自己的事件)使得重播「時間」成爲可能。 –