Axon Framework聚合事件溯源

2021-08-02 07:46:48 字數 1637 閱讀 7118

除了儲存乙個聚合的當前狀態,還可以根據過去發布的事件恢復乙個聚合的狀態。為此,所有狀態的更改必須由乙個事件來表示。

注意,聚合標識必須被設定在聚合發布的第乙個事件的@eventsourcinghandler上,這通常是建立事件。

事件溯源聚合的聚合根還必須包含乙個無參的建構函式,axon framework使用這個建構函式建立乙個空的聚合例項,在使用過去的事件之前初始化它。沒有提供這種建構函式載入聚合時將導致異常。

public

class myaggregateroot

// constructor needed for reconstruction

protected

myaggregateroot()

@eventsourcinghandler

private

void

handlemyaggregatecreatedevent(myaggregatecreatedevent event)

}

帶@eventsourcinghandler註解的方法使用特定的規則來解析。這些規則對於帶@eventhandler註解的方法也同樣適合,並在defining event handlers這一章節中徹底解釋。

注意

事件處理器(event handler)的方法可以是私有的,只要jvm的安全設定允許axon framework改變方法的可訪問性。這使你能夠清楚地分離聚合的公共api,該方法從處理事件的內部邏輯中公開生成事件的方法。大多數的ide有乙個選項來忽略「未使用的私有方法」的警告為特定註解的方法。或者,你可以新增乙個@suppresswarnings(unuseddeclaration)註解到方法,以確保你不意外地刪除事件處理器方法。

有時候,特別是當聚合結構的增長遠遠超過兩個實體時,對同一聚合的其他實體中事件發布的影響更明顯。然而,由於重構聚合狀態時事件處理器方法也會被呼叫,所以必須採取特殊的預防措施。

你還可以使用靜態aggregatelifecycle.islive()方法來檢查聚合是否「存活」。基本上,乙個聚合如果已經完成重演歷史事件會被認為是存活的。當重演這些事件時,islive()將返回false。在處理新生成的事件時,使用islive()方法是唯一可以執行的活動。

複雜的聚合結構

複雜的業務邏輯通常需要多個帶聚合根的聚合來提供支援。在這種情況下,重要的是把複雜性分布在聚合內的多個實體中。當使用事件溯源時,不僅聚合根需要使用事件來觸發狀態轉換,而且聚合內的實體也如此。

注意乙個常見的誤解,聚合的實體不應該包含任何屬性訪問方法來暴露狀態。這並非如此。事實上,在同一聚合內的實體向其他的實體暴露狀態,可能會使乙個聚合受益很多。然而,建議不要向外部暴露聚合的狀態。

axon在複雜的聚合結構中提供了對事件溯源的支援。實體,就像聚合根,簡單的物件。子實體的字段宣告必須使用@aggregatemember來註解。這個注釋告訴axon被註解的字段,包含乙個應該對命令和事件處理程式進行檢查的類。

當乙個實體(包括聚合根)應用乙個事件時,它首先是由聚合根處理,然後向下通過所有帶@aggregatemember註解的字段到其子實體。

可能包含子實體的字段必須用@aggregatemember註解,此注釋可用於多種字段型別:

Axon Framework事件處理

saga中的事件處理非常接近乙個普通的事件 上述的對於方法和引數解析的規則在這裡是有效的。不過,有乙個主要區別。雖然存在事件 只有單個例項處理所有傳入事件,但也存在乙個saga有多個例項,每個例項都對不同的事件感興趣。例如,關於order的id為1的管理業務saga對order 2 的事件不感興趣,...

聚合索引和非聚合索引

收集點面試常問道的索引問題 1.什麼是聚合索引 clustered index 什麼是非聚合索引 nonclustered index 2.聚合索引和非聚合索引有什麼區別?深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。微軟的sql server提供了兩種索引 聚集索引 cluste...

SQL 聚合函式 非聚合函式

聚合函式 聚合函式就是對一組值進行計算後返回單個值 即分組 聚合函式在計算時都會忽略空值 null 所有的聚合函式均為確定性函式。即任何時候使用一組相同的輸入值呼叫聚合函式執行後的返回值都是相同的,無二義性。2 聚合開窗函式 聚合函式加上 over 開窗函式就是聚合開窗函式。create table...