【问题标题】:Trigger Axon's @EventHandler from JmsListener从 JmsListener 触发 Axon 的 @EventHandler
【发布时间】:2019-09-11 15:27:14
【问题描述】:

在春季,org.springframework.amqp.rabbit 包使 RabbitMQ 的集成变得更加容易。 要迁移到 ActiveMQ,我无法在 spring axion 框架中直接支持 ActiveMQ,而只能使用 JMS 作为接口。

现在在发送方,我在@EventSourcingHandler 中明确调用Sender,通过它我可以在Receiver 中接收事件。

我唯一想不通的是,每当有新事件时,如何从Receiver 调用axon 的@EventHandler

接收器类:

public class Receiver {

    @JmsListener(destination = "myEventQueue")
    public void receive(AvailableQuantityInitializedEvent event) {
        // Here I need to trigger some axion's EventHandler
    }
}

发件人类别:

public class Sender {

    @Autowired
    private JmsTemplate jmsTemplate;

    public void send(AvailableQuantityInitializedEvent event) {
        jmsTemplate.convertAndSend("myEventQueue", event);
    }
}

EventSourcingHandler,发送者发送事件的地方。

@NoArgsConstructor
@Aggregate
@Data
@ComponentScan
public class SomeAggregate {

    @EventSourcingHandler
    protected void on(SomeEvent event, Sender sender) {
        this.x = event.xx();
        this.y = event.yy();
        sender.send(event);
    }
}

@EventHandler 我需要从 Receiver 触发:

@ProcessingGroup(value = "name")
@AllArgsConstructor
@Component
public class SomeProjection {

    @EventHandler
    public void on(SomeEvent evt, @Timestamp Instant timestamp) {
        System.out.println("EventHandler:SomeEvent");
    }

}

【问题讨论】:

    标签: spring rabbitmq activemq axon jmstemplate


    【解决方案1】:

    首先,我建议不要从 @EventSourcingHandler 带注释的方法发送新事件。 这种方法旨在重新创建聚合的状态 - 因此当您从它已发布的所有事件中获取该聚合时。

    您现在有效地做的是发送消息每次您是事件采购您的聚合。因此,您引入了副作用,这些副作用是不受欢迎的行为。

    其次,我想首先了解您想要实现的目标。 如果您尝试将 Axon 应用程序中的事件发布到队列中,则最好引入一个组件,该组件将为任何事件执行该操作,而不是每个事件处理程序的细粒度方法。 我建议你看看 Axon 提供的 Spring AMQP 扩展或 Kafka extension 是如何工作的。

    如果所有这些仍然在同一个应用程序中,我建议简单地使用框架本身提供的EventStore/EventBus 设置。使您的应用程序基于消息传递应该允许您在后期分离 SomeProjection 类,而不会有太多麻烦。

    最后我想指出,Axon Server 提供了一种极好的方法,可以轻松地在您的应用程序之间分发任何消息,尽管是命令、事件或查询。

    希望这会有所帮助!

    【讨论】:

    • 感谢您提及副作用。我同意你的看法,这只是一种解决方法,以后可能会咬人。但是 Spring AMQP 扩展只支持 RabbitMQ。现在要在 ActiveMQ 中复制相同的逻辑,我遇到了困难。
    • 我尝试使用 RabbitMQ 客户端并将源更改为 ActiveMQ。但是ActiveMQ支持AMQP 1.0,但是spring amqp包有0.9版本。
    • 这是正确的,你在 Mukarram 那里注意到了什么。我也不打算让您使用 Spring AMQP 扩展,而是更多地参考它来向您展示在 ActiveMQ 下实现此功能的最佳解决方案,如果您正在寻找一个专门构建的解决方案。同意,理想情况下,ActiveMQ 支持会有另一个扩展。我相信已经提交了一个问题来更新扩展以应对 AMQP 1.0。否则,我建议您在扩展的存储库下创建一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多