事件(四)
1.什么是SubscribingEventProcessor
2.优缺点
3.扩展
可以结合Axon的AMQP或Kafka扩展时,其部分局限性会得到缓解,使其成为可行方案
4.配置方式(一)
介绍
首先,若要指定新的EventProcessor器默认使用SubscribingEventProcessor,可调用usingSubscribingEventProcessors方法
原生API
public class AxonConfig {
// 省略其他配置方法...
public void configureProcessorDefault(EventProcessingConfigurer processingConfigurer) {
processingConfigurer.usingSubscribingEventProcessors();
}
}
SpringBoot
@Configuration
public class AxonConfig {
// 省略其他配置方法...
@Bean
public ConfigurerModule processorDefaultConfigurerModule() {
return configurer -> configurer.eventProcessing(EventProcessingConfigurer::usingSubscribingEventProcessors);
}
}
5.配置方式(二)
介绍
若要将特定的事件处理器配置为订阅式实例,需使用registerSubscribingEventProcessor方法
原生API
public class AxonConfig {
// 省略其他配置方法...
public void configureSubscribingProcessors(EventProcessingConfigurer processingConfigurer) {
// 配置一个订阅式处理器...
processingConfigurer.registerSubscribingEventProcessor("my-processor")
// ...并指定特定的 SubscribableMessageSource...
.registerSubscribingEventProcessor("my-processor", conf -> /* 创建并返回 SubscribableMessageSource */);
}
}
SpringBoot
@Configuration
public class AxonConfig {
// 省略其他配置方法...
@Bean
public ConfigurerModule subscribingProcessorsConfigurerModule() {
return configurer -> configurer.eventProcessing(
// 配置一个订阅式处理器...
processingConfigurer -> processingConfigurer.registerSubscribingEventProcessor("my-processor")
// ...并指定特定的 SubscribableMessageSource...
.registerSubscribingEventProcessor(
"my-processor",
conf -> /* 创建并返回 SubscribableMessageSource */
)
);
}
}
配置文件
属性文件可用于配置EventProcessor的部分字段,但Java配置方式提供了更大的自由度:
axon.eventhandling.processors.my-processor.mode=subscribing
axon.eventhandling.processors.my-processor.source=eventBus
若事件处理器的名称包含小数点,需使用map语法:
axon.eventhandling.processors[my.processor].mode=subscribing
axon.eventhandling.processors[my.processor].source=eventBus
6.错误模式
当ErrorHandler重抛异常时,SubscribingEventProcessor会将异常冒泡传递给事件发布组件。这种机制允许发布组件根据异常类型采取相应的处理策略(如终止事务、重试等)
7.持久化流
介绍
三大核心能力
工作机制
排序策略
配置
介绍
注意:
- 使用相同名称会覆盖现有流连接
- filter为null时接收所有事件
原生API
public class AxonConfig {
// 省略其他配置方法...
public void configureSubscribingProcessors(EventProcessingConfigurer processingConfigurer) {
String streamName = "my-persistent-stream-name";
int segmentCount = 4;
// 对于按聚合顺序的策略(sequential per aggregate policy),不需要设置以下参数。
// 其他策略请参考 PersistentStreamSequencingPolicyProvider 的 JavaDoc。
List<String> sequencingPolicyParameters = new ArrayList<>();
// 可选参数,用于在 Axon Server 端过滤事件。
String filter = null;
int batchsize = 1024;
PersistentStreamProperties persistentStreamProperties = new PersistentStreamProperties(
streamName,
segmentCount,
PersistentStreamSequencingPolicyProvider.SEQUENTIAL_PER_AGGREGATE_POLICY,
sequencingPolicyParameters,
PersistentStreamProperties.HEAD_POSITION,
filter
);
processingConfigurer.registerSubscribingEventProcessor(
"my-processor",
config -> new PersistentStreamMessageSource(
streamName,
config,
persistentStreamProperties,
Executors.newScheduledThreadPool(4),
batchsize
)
);
}
}
@Configuration
public class AxonConfig {
// 省略其他配置方法...
@Bean
public ConfigurerModule subscribingProcessorsConfigurerModule() {
String streamName = "my-persistent-stream-name";
int segmentCount = 4;
// 对于按聚合顺序的策略,不需要设置以下参数。
// 其他策略请参考 PersistentStreamSequencingPolicyProvider 的 JavaDoc。
List<String> sequencingPolicyParameters = new ArrayList<>();
// 可选参数,用于在 Axon Server 端过滤事件。
String filter = null;
int batchsize = 1024;
PersistentStreamProperties persistentStreamProperties = new PersistentStreamProperties(
streamName,
segmentCount,
PersistentStreamSequencingPolicyProvider.SEQUENTIAL_PER_AGGREGATE_POLICY,
sequencingPolicyParameters,
PersistentStreamProperties.HEAD_POSITION,
filter
);
return configurer -> configurer.eventProcessing(
// 配置订阅式处理器...
processingConfigurer -> processingConfigurer.registerSubscribingEventProcessor(
"my-processor",
config -> new PersistentStreamMessageSource(
streamName,
config,
persistentStreamProperties,
Executors.newScheduledThreadPool(4),
batchsize
)
)
);
}
}