Axon支持的SpringBoot自動配置是迄今爲止開始配置Axon基礎設施組件最簡單的選擇。只需添加axon-spring-boot-starter依賴性,Axon會自動配置基礎設施組件(命令總線,事件總線),以及運行和儲存聚合和Saga所需的任何組件。
根據在應用程序上下文中的其他組件,如果他們在應用程序上下文中不是已經明確定義,Axon將定義某些組件。這意味着只需要配置不同於默認值的組件。
事件總線和事件存儲配置
如果JPA可用,事件存儲默認使用JPA事件存儲引擎。這允許聚合的存儲使用事件溯源而無需任何明確的配置。
如果JPA不可用,Axon默認使用SimpleEventBus,這意味着你需要爲每個聚合指定一個非事件溯源存儲庫,或者在你的Spring配置中配置一個EventStorageEngine 。
配置一個不同的事件存儲引擎,即使JPA在class path上,只需定義一個EventStorageEngine類型的bean (使用事件溯源)或EventBus(如果不需要事件溯源)。
命令總線配置
如果在應用程序上下文中沒有顯式定義CommandBus實現,Axon會配置一個SimpleCommandBus。這個CommandBus將使用PlatformTransactionManager管理事務,如果它在上下文中可用。
如果只有CommandBus bean定義是一個DistributedCommandBus實現,Axon仍將配置一個CommandBus實現作爲DistributedCommandBus本地segment。這個bean將獲取一個“localSegment”限定符。建議定義DistributedCommandBus爲@Primary,以便它優先考慮依賴注入。
聚合配置
@Aggregate註解(在org.axonframework.spring.stereotype包中)觸發自動配置,配置使用帶註解的類型的必要組件作爲聚合 。注意,只有聚合根需要註解。
Axon會用命令總線自動註冊所有帶@CommandHandler註解的方法,並且如果不存在則建立一個存儲庫。
建立一個與默認情況不同的存儲庫,在應用程序上下文中定義一個。可選地,你可以定義要使用的存儲庫的名稱,在@Aggregate上使用存儲庫屬性。如果沒有定義存儲庫屬性,Axon將嘗試以聚合的名稱使用存儲庫(第一個字符小寫),後綴爲存儲庫。依此類推,一個MyAggregate類的類型,默認的存儲庫名字叫myAggregateRepository。如果沒有找到那個名稱的bean,Axon將定義一個EventSourcingRepository(如果沒有EventStore可用其會失敗)。
Saga配置
基礎設施組件的配置操作的Saga是@Saga註解觸發的(在org.axonframework.spring.stereotype包中)。Axon會配置一個SagaManagert和SagaRepository。SagaRepository將在上下文中使用一個可用的SagaStore(如果找到JPA默認爲JPASagaStore)爲實際Saga存儲。
爲Saga使用不同的SagaStores,在每個@Saga註解的sagaStore屬性中,提供要使用的SagaStore的bean名稱。
Saga將從應用程序上下文中注入資源。注意,這並不意味着Spring-injecting用於注入這些資源。@Autowired和@javax.inject.Inject註解可用於標定依賴關係,但它們由Axon通過尋找這些被註解的字段和方法來注入。構造函數注入(還)不支持。
事件處理(Event Handling)配置
默認情況下,所有單例Spring bean組件包含帶@EventHandler註解的方法,將訂閱一個事件處理器去接收事件消息發佈到事件總線。
EventHandlingConfiguration bean,在應用程序上下文可用,有方法來調整事件處理程序的配置。有關詳細信息,請參閱配置API配置事件處理程序和事件處理器。
更新事件處理(EventHandling)配置,創建一個autowired方法,設置你想要的配置:
@Autowired
public void configure(EventHandlingConfiguration config) {
config.usingTrackingProcessors(); // default all processors to tracking mode.
}
事件處理器((Event Processors)的某些方面也可以在application.properties中配置。
axon.eventhandling.processors["name"].mode=tracking
axon.eventhandling.processors["name"].source=eventBus
使用application.yml:
axon:
eventhandling:
processors:
name:
mode: tracking
source: eventBus
源文件屬性指的是bean的名稱實現了SubscribableMessageSource或StreamableMessageSource,名稱應該被用來做上述處理器的事件源。源文件默認事件總線或事件存儲在應用程序上下文中定義。
啓用AMQP
啓用AMQP支持,確保axon-amqp模塊在類路徑上,並且在應用程序上下文中AMQP ConnectionFactory是可用的(例如通過引用spring-boot-starter-amqp)。
在應用程序中轉發生成的事件到一個AMQP Channel,一行application.properties配置就夠了:
axon.amqp.exchange=ExchangeName
這將以給定的名稱自動發送所有已經發布的事件到AMQP Channel。
默認情況下,發送時沒有使用AMQP事務。這可以使用axon.amqp.transaction-mode屬性覆蓋,並設置它爲事務或publisher-ack。
從隊列中接收事件,並在Axon應用程序內處理它們,你需要配置一個SpringAMQPMessageSource:
@Bean
public SpringAMQPMessageSource myQueueMessageSource(AMQPMessageConverter messageConverter) {
return new SpringAMQPMessageSource(messageConverter) {
@RabbitListener(queues = "myQueue")
@Override
public void onMessage(Message message, Channel channel) throws Exception {
super.onMessage(message, channel);
}
};
}
然後配置一個處理器,使用這個bean作爲其消息來源:
axon.eventhandling.processors["name"].source=myQueueMessageSource
使用JGroups分發命令
進行中…如果你不能等,添加一個依賴項到axon-spring-boot-starter-jgroups模塊。