Axon Framework跟蹤最後期限

當有事發生時,很容易使一個saga採取行動。畢竟,有一個事件要通知saga。但是如果你想讓你的saga,在什麼事情都沒發生的情況下做些什麼呢?這就是最後期限。在發票中,通常是幾周,而信用卡支付的確認可能在幾秒鐘內。

在Axon中,你可以使用一個EventScheduler計劃發佈一個事件。在發票的例子中,你希望發票在30內付清。saga將在發送CreateInvoiceCommand後,安排一個InvoicePaymentDeadlineExpiredEvent在30天后發佈。計劃一個事件後EventScheduler返回ScheduleToken。這個令牌可以用來取消計劃,例如已收到發票的付款。

Axon提供了兩種EventScheduler實現:一個純Java和一個使用Quartz 2作爲調度機制支持。

這個純java實現的EventScheduler使用ScheduledExecutorService去計劃事件發佈。雖然這個計劃器的定時非常可靠,但它是一個純內存實現。一旦JVM關閉,所有的計劃都將丟失。這使得這種實現不適合長期限的計劃。

SimpleEventScheduler 需要配置一個EventBus和一個SchedulingExecutorService(看java.util.concurrent.Executors類的靜態方法的helper方法)。

QuartzEventScheduler是一個更可靠,企業信得過的實現。使用Quartz 作爲底層調度機制,它提供了更強大的功能,如持久性、集羣和失敗的管理。這意味着事件發佈將被保證。可能會晚一點,但會發布。

需要配置一個Quartz調度器和EventBus。另外,你可以設置以組的名稱進行計劃,默認爲”AxonFramework-Events”

一個或多個組件將監聽計劃的事件。這些組件可能依賴於綁定到調用它們的線程的事務。計劃的事件由EventScheduler管理的線程發佈。管理事務在這些線程上,你可以配置一個TransactionManager或UnitOfWorkFactory創建一個事務綁定工作單元。

注意
Spring用戶可以使用quartzeventschedulerfactorybean或simpleeventschedulerfactorybean進行更簡單的配置。它允許你直接設置PlatformTransactionManager。

注入資源
saga一般做的不僅僅是維護基於事件的狀態。它們與外部的組件進行交互。要做到這一點,他們需要訪問處理組件所需的資源。通常,這些資源實際上並不是saga狀態的一部分,也不應該持久化。但是,一旦重新構建一個saga,在事件被路由到該實例之前,必須注入這些資源。

爲了這個目的有了ResourceInjector。它使用SagaRepository將資源注入到一個saga。Axon提供了SpringResourceInjector用應用程序上下文中的資源注入帶註解的字段和方法,和一個SimpleResourceInjector,註冊已經註冊的資源到用@Inject註解的方法和字段。

提示
由於資源與saga不應該被持久化,所以務必向這些字段添加臨時關鍵字。這將防止序列化機制嘗試將這些字段的內容寫入存儲庫。存儲庫將在saga被反序列化之後自動重新注入所需的資源。

Simpleresourceinjector允許一個預先指定的資源集合被注射。它掃描saga的(setter)方法和字段,以找到被@Inject註解的那個。

當使用配置API,Axon將默認爲the ConfigurationResourceInjector。它將注入配置中可用的任何資源。組件像EventBus、EventStore CommandBus和CommandGateway默認情況下是可用的,但你也可以使用configurer.registerComponent()註冊自己的組件。

Springresourceinjector使用Spring的依賴注入機制注入資源聚合。這意味着,如果需要,可以使用setter注入或直接字段注入。要注入的方法或字段需要註解,以便Spring識別它爲依賴項。例如@Autowired。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章