1. 程式人生 > >Axon Framework工作單元,The Unit of Work

Axon Framework工作單元,The Unit of Work

工作單元是Axon Framework的一個重要的概念,雖然在大多數情況下你可能不太直接與它互動。訊息的處理被視為一個獨立單元。工作單元的目的是在處理一條訊息(命令或事件)期間去協調行為的執行。元件可以在工作單元每一個階段執行註冊行為,如onPrepareCommit或onCleanup。

你可能不太需要直接訪問工作單元,主要使用Axon提供的構件來訪問。不管出於什麼原因,如果你需要訪問它,有幾種方式可以獲得它。處理器可以在處理函式中通過一個引數來接收工作單元。如果你使用註解,你可以新增一個UnitOfWork型別引數到你被註解的函式。在其他地方,你可以通過呼叫CurrentUnitOfWork.get()把工作單元繫結到當前執行緒。注意,如果沒有把工作單元繫結到當前執行緒,這個方法將丟擲一個異常。使用CurrentUnitOfWork.isStarted()可檢測它是否可用。

需要訪問當前工作單元的一個原因是,在訊息處理過程中附加需要多次重複使用的資源,或者,如果建立資源時需要在工作單元結束時進行清理工作。在這種情況下,unitOfWork.getOrComputeResource()和生命週期回撥方法,如onRollback(),afterCommit()和onCleanup(),允許你在工作單元處理期間,註冊資源和宣告行為。

注意
注意工作單元只是變化的快取,不是事務的替代品。儘管當工作單位被提交時,所有的階段更改都被提交,但它的提交不是原子性的。這意味著,當提交失敗時一些變化可能會被持久化,而另一些則沒有。最佳實踐要求命令不應該包含多個行為。如果你堅持這種做法,一個工作單元只包含一個單一的行為,從而將使其被安全使用。如果你的工作單元中有更多的行為,那麼你可以考慮將一個事務附加到工作單元的提交。當工作單元提交時,使用unitOfWork.onCommit(. .)註冊一個行為。

你的處理器可以丟擲一個異常作為處理訊息的結果。預設情況下,未經檢測的異常將導致UnitOfWork回滾所有的更改。結果是 ,預定的副作用被撤消。

Axon 提供了一些開箱即用的回滾策略:

  • RollbackConfigurationType.NEVER ,總是提交工作單元。
  • RollbackConfigurationType.ANY_THROWABLE ,當異常發生時總是回滾。
  • RollbackConfigurationType.UNCHECKED_EXCEPTIONS,錯誤和執行時異常回滾。
  • RollbackConfigurationType.RUNTIME_EXCEPTION ,執行時異常回滾(但不是錯誤)

當使用Axon 元件處理訊息時,將自動為你管理工作單元的生命週期。如果你選擇不使用這些元件,但實現自己的處理,則需要以程式設計方式啟動和提交(或回滾)工作單元。

在大多數情況下,DefaultUnitOfWork將為你提供你所需要的功能。它在單執行緒中處理程序。在一個工作單元上下文中執行一個任務,可以new一個DefaultUnitOfWork並簡單地呼叫UnitOfWork.execute(Runnable)或UnitOfWork.executeWithResult(Callable)函式。典型的用法如下:

UnitOfWork uow = DefaultUnitOfWork.startAndGet(message); 
// then, either use the autocommit approach: 
uow.executeWithResult(() -> ... logic here);
// or manually commit or rollback:
 try {
    // business logic comes here
    uow.commit();
} catch (Exception e) {
    uow.rollback(e);
    // maybe rethrow...
}

一個工作單元瞭解各個階段。每當它進展到不同的階段時,就會通知UnitOfWork監聽器。

活動階段:這是開始工作單元的地方。工作單元通常在當前執行緒中的這個階段被註冊(通過CurrentUnitOfWork.set(UnitOfWork))。隨後,訊息通常在此階段由訊息處理器處理。

提交階段:在處理完訊息之後,但是在提交工作單元之前,將呼叫onPrepareCommit監聽器。如果一個工作單元被繫結到一個事務中,那麼將呼叫onCommit監聽器來提交任何的支援事務。當提交成功時,將呼叫afterCommit監聽器。如果在提交或任何步驟之前失敗,將呼叫onRollback監聽器。如果可用,則訊息處理器的結果包含在工作單元的ExecutionResult中。

清理階段:在此階段,該工作單元(如鎖)所持有的任何資源都將被釋放。如果多個工作單元被巢狀,那麼清理階段將被推遲到外部的單元工作都準備好清理為止。

訊息處理過程可以被認為是一個原子過程;它要麼完全被處理,要麼完全不被處理。Axon Framework使用工作單元來跟蹤訊息處理器執行的操作。在處理器完成後,Axon 將嘗試提交在工作單元中註冊的操作。

將事務繫結到工作單元是可能的。許多元件,例如CommandBus的實現和所有非同步處理事件處理器,都允許你配置事務管理器(Transaction Manager)。然後,該事務管理器將被用於建立事務,以繫結到用於管理訊息處理的工作單元。

當應用程式元件在訊息處理的不同階段需要資源時,比如,資料庫連線或實體管理器(EntityManager),這些資源能被附加到工作單元。 unitOfWork.getResources()函式允許你訪問附加到當前工作單元中的資源。有幾個輔助方法可以直接在工作單元中使用,以便更容易地使用資源。