事件处理程序在一个单独的类Axon 3.0.3中

时间:2017-04-20 22:55:54

标签: java spring-boot axon

我使用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没有被调用?

1 个答案:

答案 0 :(得分:2)

在Axon 3中,事件存储是事件总线的替换。它基本上是一个专门的实现,它不仅仅转发要订阅的事件,而且还存储它们。

在您的配置中,您同时拥有事件总线和事件存储。 Aggregate的事件可能会发布到Event Store。由于您在直接发布到事件总线时在处理程序中接收事件,因此您的处理程序将在那里订阅。

解决方案:从配置中删除Event Bus并专门使用Event Store。