Axon Framework事件處理

2021-08-02 10:28:25 字數 2015 閱讀 3943

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

axon不會將所有事件都發布給所有saga例項(這將是對資源的完全浪費),而是只發布與saga相關聯的屬性的事件。這個通過使用associationvalues完成。乙個associationvalue由key和value組成。key代表識別符號使用的型別,例如「orderid」或「order」。value表示前面例子中相應「1」或「2」值。

帶@sagaeventhandler註解的方法被評估的順序與帶@eventhandler的相同。如果處理器方法的引數與傳入的事件匹配,那麼方法就匹配,如果saga有乙個定義在處理器方法上的association屬性。

@sagaeventhandler註解有兩個attribute,其中associationproperty是最重要的。這是傳入事件上property的名稱,應該用來尋找相關的saga。association值的key是property的名稱。這個值是由property的getter方法返回的值。

例如,考慮乙個帶」string getorderid()」方法傳入事件,返回「123」。如果乙個帶@sagaeventhandler(associationproperty = orderid)註解的方法接受這個事件,這個事件被路由到所有已經與帶乙個鍵為orderid和值為「123」的associationvalues關聯的saga。這可能是乙個,多個,甚至沒有。

有時,想要關聯的屬性的名稱不是想要使用的關聯的名稱。例如,你有乙個銷售訂單相匹配購買訂單的saga。你可以有乙個包含「buyorderid」和「sellorderid」的事務物件。如果你想要的saga將「orderid」作為關聯的值,你可以定義乙個不同的keyname 在@sagaeventhandler註解中。它將變成@sagaeventhandler(associationproperty=」sellorderid」, keyname=」orderid」)。

管理關聯

當乙個saga事務管理跨多個域的概念,如訂單、發貨,、發票,等等,saga需要與這些概念的例項關聯。乙個關聯需要兩個引數:key,識別關聯的型別(訂單、發貨等)和乙個value,該值表示該概念的識別符號。

在以下幾個方面完成用概念關聯到saga。第一,當新建立乙個saga時將呼叫乙個用@startsaga註解的事件處理器時,它將自動與@sagaeventhandler方法中標識的關聯。所有其他的關聯用sagalifecycle.associatewith(string key, string/number value)方法建立。用sagalifecycle.removeassociationwith(string key, string/number value)方法去移除乙個特定的關聯。

想象一下為乙個圍繞著訂單的事務而已經被建立的乙個saga。saga自動關聯訂單,方法被@startsaga註解。saga是負責建立該訂單的發票,並告訴航運建立乙個載貨量。一旦貨物到達和發票支付,交易完成後,saga被關閉。

這是乙個saga的**:

public class ordermanagementsaga 

@sagaeventhandler(associationproperty = "shipmentid")

public void handle(shippingarrivedevent event)

}@sagaeventhandler(associationproperty = "invoiceid")

public void handle(invoicepaidevent event)

}// ...

}

通過允許客戶端生成識別符號,可以很容易地與乙個概念相關聯,而不需要請求響應型別命令。在發布命令之前,我們將事件與這些概念關聯起來。通過這種方式,我們也保證捕捉到作為該命令的一部分生成的事件。一旦發票付清,貨物到達,saga也將結束。

Axon Framework聚合事件溯源

除了儲存乙個聚合的當前狀態,還可以根據過去發布的事件恢復乙個聚合的狀態。為此,所有狀態的更改必須由乙個事件來表示。注意,聚合標識必須被設定在聚合發布的第乙個事件的 eventsourcinghandler上,這通常是建立事件。事件溯源聚合的聚合根還必須包含乙個無參的建構函式,axon framewo...

事件流 事件捕獲?事件冒泡?

事件流 從頁面中接收事件的順序。也就是說當乙個事件產生時,這個事件的傳播過程,就是事件流。ie中的事件流叫事件冒泡 事件冒泡 事件開始時由最具體的元素接收,然後逐級向上傳播到較為不具體的節點 文件 對於html來說,就是當乙個元素產生了乙個事件,它會把這個事件傳遞給它的父元素,父元素接收到了之後,還...

事件捕獲事件冒泡事件委派

當事件發生時,事件從dom樹頂層節點,一直傳播到目標節點,這個階段就叫做事件捕獲階段 當事件發生時,事件從目標節點,一直傳播到dom樹頂層節點,這個階段就叫做事件冒泡階段 當事件發生時,事件傳播順序為 事件捕獲階段 事件目標階段 事件冒泡階段 function stopbubble e else f...