2017-03-09 49 views
0

我有一個用例,我想發佈一個非狀態chaininging事件作爲觸發器。Axon:Eventsourced Aggregate none state change event

在絕大多數情況下,聚合會通過應用它們來發布事件。但是,有時需要將事件(可能來自另一個組件內)直接發佈到事件總線。要發佈事件,只需在EventMessage中包裝描述事件的有效負載即可。 GenericEventMessage.asEventMessage(Object)方法允許您將任何對象封裝到EventMessage中...

事件從佐賀內部發布。

當我使用asEventMessage,看看事件表我有點困惑。該事件具有在系統其餘部分中不存在的集合標識符,並且類型條目爲null(閱讀文檔時,聽起來好像asEventMessage的預期行爲等於從集合中應用事件)。

由於我在考慮事件,我在談論概念上的聚合的一部分,它應該是指它,對吧?

所以我製作一個GenericDomainMessage自己並設置其集合標識符,序列號和手動鍵入:

@SagaEventHandler 
public void on (AnotherEvent event, @SequenceNumber long sequenceNr) { 

    // ... 

    GenericDomainEventMessage myEvent = new GenericDomainEventMessage(
      MyAggregate.class.getSimpleName(), 
      identifier.toString(), 
      sequenceNr + 1, 
      payload); 
    eventStore.publish(myEvent); 

} 

此事件不會引入(數據)的狀態變化到其基礎集合體。我把它當作一個在域中具有強烈含義的標誌/觸發器。

我也可以在命令處理程序中從集合中發佈事件,但是需要執行的某些操作不在集合範圍之內。這就是爲什麼佐賀似乎更適合。

所以我的問題是:

正在出版GenericDomainEventMessage等於AggrgateLifeCycle#apply的行爲?

應該在聚合中有一個沒有op的處理程序,或者axon會正確處理這個嗎?

回答

1

在Axon 3中,將事件發佈到EventBusapply()相同,但有一點區別:apply()也會調用任何可用的處理程序。如果沒有處理程序可用,則沒有區別。

EventBus.publish旨在發佈不應與聚合直接相關的事件。在Event Store表中,它確實得到了一個聚合標識符(等於消息標識符),但這是一個技術細節。

對您而言,推薦的解決方案是apply() Event。事件不會觸發狀態變化的事實在這一點上並不重要。您沒有義務爲其定義@EventSourcingHandler