Axon Saga添加@ProcessingGroup后异常从头处理事件的问题咨询
Axon Saga添加@ProcessingGroup后异常重放历史事件的问题
问题详情
- 之前创建带
@ProcessingGroup注解的Saga时,跟踪令牌会基于事件流的头部(最新全局索引)初始化,不会重放历史事件。 - 最近新增同配置的Saga时,该Saga却从事件流的尾部开始处理(即重放所有历史事件),且没有配置任何专属处理器。
- 删除跟踪令牌并移除
@ProcessingGroup注解后,Saga恢复从最新事件位置开始处理的正常行为。 - 即使清空所有跟踪处理器的配置,现象依旧:
- 加
@ProcessingGroup注解 → 从头处理所有历史事件 - 显式配置头部令牌或不加注解 → 行为恢复正常
- 加
示例代码
object EventProcessors { const val onboardingSaga = "onboardingSaga" } @Saga @ProcessingGroup(EventProcessors.onboardingSaga) class OnboardingSaga { @StartSaga @SagaEventHandler(associationProperty = "onboardingId") fun on(event: OnboardingStartedEvent) { // 业务逻辑代码 } }
环境
Spring Boot 搭配 Axon 4.6.2
原因
Axon中每个@ProcessingGroup对应独立的跟踪令牌存储。首次使用新的处理器组名称时,Axon默认会将令牌初始化为事件流的起始位置,也就是从头消费所有事件;而未添加@ProcessingGroup的Saga使用默认处理器组,默认会从最新的事件位置初始化令牌。
解决办法
- 代码配置初始令牌位置:给目标处理器组显式指定初始令牌为事件流尾部(最新事件位置),Spring Boot配置类示例:
Java版本:
Kotlin版本:@Configuration public class AxonProcessorConfig { public AxonProcessorConfig(EventProcessingConfigurer configurer) { configurer.registerTrackingEventProcessorConfiguration( "onboardingSaga", cfg -> cfg.initialTrackingToken(streamableSource -> streamableSource.createTailToken()) ); } }@Configuration class AxonProcessorConfig(configurer: EventProcessingConfigurer) { init { configurer.registerTrackingEventProcessorConfiguration( EventProcessors.onboardingSaga, { cfg -> cfg.initialTrackingToken { streamableSource -> streamableSource.createTailToken() } } ) } } - 手动初始化令牌:若不想修改代码,可在应用首次启动前,直接在Axon的跟踪令牌存储表(通常是
tracking_token_entry)中插入对应处理器组的尾部令牌记录。 - 移除@ProcessingGroup注解:如果该Saga不需要独立的处理器组,直接去掉注解,使用默认处理器组,即可自动从最新事件位置开始处理。
内容的提问来源于stack exchange,提问作者Vaelyr
相关产品推荐
相关产品推荐

