【问题标题】:Sending the message to specific RabbitMQ Queue using SpringIntegration Java DSL使用 SpringIntegration Java DSL 将消息发送到特定的 RabbitMQ 队列
【发布时间】:2023-04-15 05:03:01
【问题描述】:

我正在开发一个使用 Spring Boot 版本 2.0.4.RELEASE 和 RabbitMQ 版本 3.7.7 的 Java 应用程序。该应用程序将来自 RabbitMQ 的所有消息缓存在 Redis 数据库中,并且在 RabbitMQ 中创建新队列时必须重新发送。目前,我设法使用Event Exchange Plugin 以及队列名称来捕获队列创建。我正在使用AMQP outbound adapter 将消息发送回 RabbitMQ。

流出

public IntegrationFlow outFlow(AmqpTemplate amqpTemplate) {
    return IntegrationFlows.from(outputChannel())
            .handle(Amqp.outboundAdapter(amqpTemplate)
                    .routingKeyExpression("headers.routingKey")
                    .exchangeNameExpression("headers.exchange"))
            .get();
}

我可以使用 routingKey 将消息发送到特定的交换。但是,我不知道如何在出站适配器中配置队列名称。这样我就可以将消息发送到该特定队列。

【问题讨论】:

  • IIRC,将 routingKeys 映射到队列是您在 RabbitMQ 服务器中配置的东西,而不是在发送者中......所以发送者只需要知道他们应该使用什么正确的 routingKey,以及实际的队列隐藏在交换“后面”...
  • 是的,发件人只需要知道'routingKey'和'exchangeName'。在我的场景中,我需要发送到特定队列,而不是链接到该特定交换的所有队列。如果可能的话,我很乐意绕过交换将消息直接发送到队列。
  • 但是您可以将 RabbitMQ 交换配置为“知道”以将特定的 routingKey 路由到特定的队列 - 然后您的客户端通过选择正确的 routingKey,将看到其消息最终进入正确的队列。 ..
  • 是的,我们可以使用“routingKey”将交换绑定到队列。不幸的是,我的规范之前要求不要创建队列。因此,当新客户端连接并订阅消息时,RabbitMQ 会创建一个新队列。所以可能有多个队列绑定到一个交换。但是,当创建一个新队列时,我想将消息发送到该特定队列,而不是所有队列都绑定到该交换。
  • 您是否只想在注册时为每个队列创建一个路由密钥,然后以某种方式与所有客户端共享这些密钥?那样的话,他们会为正确的队列使用正确的路由键,而交换器会将其传递到相应的队列?

标签: java rabbitmq spring-integration spring-amqp


【解决方案1】:

如果要发送到特定队列,请使用队列名称作为路由键和默认全局交换 - 空名称。有一种特殊的直接交换器,所有队列都通过它们的名称作为路由键绑定到它。

有关更多信息,请参阅 AMQP 协议文档:https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-default

【讨论】: