AxonFramework,分發事件

在某些情況下,有必要發佈事件到外部系統,比如消息broker。

Spring AMQP

Axon提供了開箱即用的支持從一個AMQP message broker中轉遞事件和傳遞事件到broker中,比如Rabbit MQ。

將事件轉發到AMQP Echange

SpringAMQPPublisher將事件轉發給一個AMQP Exchange。它使用SubscribableMessageSource初始化,一般是EventBus或EventStore。從理論上講,這可能是發佈者可以訂閱的任何事件源。

要配置SpringAMQPPublisher,只需一個實例定義爲Spring Bean。有一些setter方法允許你指定你預期的行爲,如事務支持,publisher 確認(如果由broker支持),和交換名稱。

默認的exchange名稱爲’Axon.EventBus’

注意
注意,exchanges不會被自動創建。你還必須聲明隊列、Exchanges 和你希望使用的Bindings 。檢查Spring文檔瞭解更多信息。

從AMQP 隊列中讀取事件

Spring已經廣泛的支持從一個AMQP隊列讀取消息。然而,這需要與Axon“架橋”,以便這些消息可以從Axon處理,就像它們是常規事件消息一樣。

SpringAMQPMessageSource允許事件處理器從隊列中讀取消息,而不是事件存儲或事件總線。它作爲一個Spring AMQP和SubscribableMessageSource之間的適配器需要這些處理器。

配置SpringAMQPMessageSource最簡單的方法,是通過定義一個bean,重寫默認的onMessage方法並使用@RabbitListener註解,如下:

@Bean
public SpringAMQPMessageSource myMessageSource(Serializer serializer) {
    return new SpringAMQPMessageSource(serializer) {
        @RabbitListener(queues = "myQueue")
        @Override
        public void onMessage(Message message, Channel channel) throws Exception {
            super.onMessage(message, channel);
        }
    };
}

Spring的@RabbitListener註解告訴Spring,這個方法需要被給定隊列上的每個消息調用(myQueue的例子)。此方法簡單地調用super.onMessage()方法,執行實際事件的發佈到已經訂閱它的所有處理器。

訂閱這個MessageSource的處理器,將正確的SpringAMQPMessageSource實例傳遞給訂閱處理器的構造函數:

// in an @Configuration file:
@Autowired
public void configure(EventHandlingConfiguration ehConfig, SpringAmqpMessageSource myMessageSource) {
    ehConfig.registerSubscribingEventProcessor("myProcessor", c -> myMessageSource);
}

請注意跟蹤處理器與SpringAMQPMessageSource不兼容。

異步事件處理

異步處理事件推薦的方法是使用跟蹤事件處理器。這個實現可以保證所有事件的處理,甚至在發生系統故障的情況下(假定事件已經被持久化)。

然而,也有可能在SubscribingProcessor中異步處理事件。要做到這一點,SubscribingProcessor必須用EventProcessingStrategy配置。這種策略可以用來改變事件監聽器的調用應如何管理。

默認策略(DirectEventProcessingStrategy)在傳遞事件的線程中調用這些事件處理程序。這允許處理器使用現有的事務。

其他Axon-provided strategy是AsynchronousEventProcessingStrategy。它使用一個Executor異步調用事件偵聽器。

儘管AsynchronousEventProcessingStrategy異步執行,某些事件按順序處理仍然是可取的。SequencingPolicy定義事件是否必須按順序處理,並行或兩者的結合。策略返回給定事件的序列標識符。如果兩個事件的策略返回一個相等的標識符,這意味着他們必須由事件處理程序按順序處理。一個空序列標識符意味着事件可能與任何其他事件並行處理。

Axon提供了一些可以使用的通用策略:

  • FullConcurrencyPolicy會告訴Axon,事件處理程序可以處理所有併發事件。這意味着需要按特定順序處理的事件之間沒有關係。
  • SequentialPolicy告訴Axon,所有活動必須按照順序進行處理。處理事件的操作將在處理前一個事件完成時開始。
  • SequentialPerAggregatePolicy將迫使領域事件從同一聚合順序處理。然而,事件來自不同聚合可能併發處理。這通常是一個合適的政策,用於事件偵聽器更新數據庫中聚合的細節。

除了這些提供的策略之外,你可以定義自己的策略。所有策略都必須實現SequencingPolicy接口。這個接口定義了一個方法getSequenceIdentifierFor,返回值爲一個給定的事件序列標識符。返回相等序列標識符的事件必須按順序處理。產生不同序列標識符的事件可以同時處理。出於性能原因,如果事件可以並行處理任何其他事件,則策略實現應該返回null。這樣更快,因爲Axon不必檢查對事件處理的任何限制條件。

當使用AsynchronousEventProcessingStrategy時建議明確定義一個ErrorHandler。默認的ErrorHandler傳播異常,但在異步執行中沒有什麼可以傳播的,除了Executor。這可能導致事件沒有被處理。相反,建議使用一個ErrorHandler報告錯誤,並允許繼續處理。ErrorHandler被配置在SubscribingEventProcessor的構造函數上,還提供了EventProcessingStrategy。

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