【问题标题】:Publishing different types of events to different queues将不同类型的事件发布到不同的队列
【发布时间】:2018-06-13 12:11:54
【问题描述】:

我正在尝试创建一个简单的微服务项目来学习使用 Axon 框架。

我已经使用以下代码通过 RabbitMQ 设置了消息传递:

@Bean
public Exchange exchange() {
    return ExchangeBuilder.fanoutExchange("Exchange").build();
}

@Bean
public Queue queue() {
    return QueueBuilder.durable("QueueA").build();
}

@Bean
public Binding binding() {
    return BindingBuilder.bind(queue()).to(exchange()).with("*").noargs();
}

@Autowired
public void configure(AmqpAdmin admin) {
    admin.declareExchange(exchange());
    admin.declareQueue(queue());
    admin.declareBinding(binding());
}

我的 application.properties 中的以下内容:

axon.amqp.exchange=Exchange

使用此配置,通过 Axon 框架发布的所有事件都将发送到 QueueA。但是现在我想让所有 EventA 事件都转到 QueueA,而所有 EventB 事件都转到 QueueB。我该怎么做?

【问题讨论】:

    标签: java rabbitmq spring-amqp axon


    【解决方案1】:

    默认情况下,Axon Framework 使用事件的包名作为 AMQP Routing Key。这意味着您可以使用模式将队列绑定到主题交换,以匹配这些路由键。 请参阅https://www.rabbitmq.com/tutorials/tutorial-five-java.html 了解更多信息。

    您可以自定义 Axon 的行为,方法是提供自定义 RoutingKeyResolver(一个为给定 EventMessage 返回字符串的简单函数)。然后在AMQPMessageConverter 中进行配置,该AMQPMessageConverter 负责创建基于Axon EventMessage 的AMQP 消息(反之亦然)。如果您对默认的 AMQP 消息格式没问题,可以使用 DefaultAMQPMessageConverter

    【讨论】:

    • 感谢您为我指明正确的方向。提供RoutingKeyResolver 就像一种魅力。我可以从EventMessage 有效负载中获取事件信息,并使用它来获取适合我需要的路由密钥。当所有单独的事件进入单独的队列时,也可以使用直接交换而不是主题交换。
    【解决方案2】:

    但是您使用的是 fanoutExchange,因此它会将事件放到所有队列中,您只需创建另一个队列并与 sameExchange 和查询端绑定即可处理事件

    【讨论】:

    • 是的,但这不是我希望它工作的方式。阿拉德的回答正是我所需要的。
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多