我使用Axon& amp;有一个相当简单的CQRS设置。弹簧。
这是配置类。
@AnnotationDriven
@Configuration
public class AxonConfig {
@Bean
public EventStore eventStore() {
...
}
@Bean
public CommandBus commandBus() {
return new SimpleCommandBus();
}
@Bean
public EventBus eventBus() {
return new SimpleEventBus();
}
}
这是我的聚合......
@Aggregate
public class ThingAggregate {
@AggregateIdentifier
private String id;
public ThingAggregate() {
}
public ThingAggregate(String id) {
this.id = id;
}
@CommandHandler
public handle(CreateThingCommand cmd) {
apply(new ThingCreatedEvent('1234', cmd.getThing()));
}
@EventSourcingHandler
public void on(ThingCreatedEvent event) {
// this is called!
}
}
这是我在一个单独的.java文件中的EventHandler ......
@Component
public class ThingEventHandler {
private ThingRepository repository;
@Autowired
public ThingEventHandler(ThingRepository thingRepository) {
this.repository = conditionRepository;
}
@EventHandler
public void handleThingCreatedEvent(ThingCreatedEvent event) {
// this is only called if I publish directly to the EventBus
// apply within the Aggregate does not call it!
repository.save(event.getThing());
}
}
我使用CommandGateway发送原始创建命令。我在Aggregate中的CommandHandler接收命令很好,但是当我在我的Aggregate中调用apply
时,传递一个新的Event,我的EventHandler在外部类中,不会被调用。只调用Aggregate类中的EventHandler。
如果我尝试将Event直接发布到EventBus,则会调用我的外部EventHandler。
当我在Aggregate中调用apply
时,有什么想法为什么我的外部java类中的EventHandler没有被调用?
答案 0 :(得分:2)
在Axon 3中,事件存储是事件总线的替换。它基本上是一个专门的实现,它不仅仅转发要订阅的事件,而且还存储它们。
在您的配置中,您同时拥有事件总线和事件存储。 Aggregate的事件可能会发布到Event Store。由于您在直接发布到事件总线时在处理程序中接收事件,因此您的处理程序将在那里订阅。
解决方案:从配置中删除Event Bus并专门使用Event Store。