Rabbitmq 如何为生产者和消费者成功设置路由密钥

Rabbitmq 如何为生产者和消费者成功设置路由密钥,rabbitmq,spring-cloud-stream,Rabbitmq,Spring Cloud Stream,我正在构建一个基于SpringCloud流的应用程序,exchange类型为topic,消息从topic exchange发送到2个队列消费者组。场景是这样的: 我的应用程序中的服务A希望根据不同的用例场景(如预订、取消、更新等),通过名为“预约请求”的交换向服务B和服务C发送预约类型的消息 因此,带有键“约会.book.B”或“约会.cancel.B”的消息应转到“消费者队列组约会”。B 带有键“约会.book.C”或“约会.cancel.C”的邮件应转到消费者队列组约会.C 如何成功地做到这

我正在构建一个基于SpringCloud流的应用程序,exchange类型为topic,消息从topic exchange发送到2个队列消费者组。场景是这样的:

我的应用程序中的服务A希望根据不同的用例场景(如预订、取消、更新等),通过名为“预约请求”的交换向服务B和服务C发送预约类型的消息

因此,带有键“约会.book.B”或“约会.cancel.B”的消息应转到“消费者队列组约会”。B

带有键“约会.book.C”或“约会.cancel.C”的邮件应转到消费者队列组约会.C

如何成功地做到这一点

生产性服务业的结构:

spring.cloud.stream.bindings.output.destination=appointments-request
spring.cloud.stream.bindings.input.destination=appointments-reply
spring.cloud.stream.rabbit.bindings.output.producer.exchangeType=topic
spring.cloud.stream.rabbit.bindings.output.producer.routingKeyExpression= 
 appointments.#.#
消费者服务B的配置:

spring.cloud.stream.rabbit.bindings.input.consumer.exchangeType=direct
spring.cloud.stream.rabbit.bindings.input.consumer.group=
appointments.docmgmt
spring.cloud.stream.rabbit.bindings.input.consumer.bindingRoutingKey=
appointments.docmgmt
spring.cloud.stream.rabbit.bindings.input.consumer.routingKeyExpression= 
appointments.#.docmgmt
生产者服务A有以下方法来设置路由密钥

    public boolean send(AppointmentEvent appointmentEvent) 
    {
       logger.info("Sending event {} ",appointmentEvent);
       return this.source.output().
       send(MessageBuilder.withPayload(appointmentEvent).
       setHeader(SimpMessageHeaderAccessor.DESTINATION_HEADER, 
       "appointments.book.docmgmt").build());
     }
我的服务之间的通信不起作用。

预约

不能在生产者端使用通配符

你需要像这样的东西

spring.cloud.stream.rabbit.bindings.output.producer.routingKeyExpression=headers['routingKey']
然后生产者将routingKey头设置为每条消息所需的值


您不应该真正使用Simp头文件;那是为了跺脚;使用您自己的标题。

非常感谢Gary!我按照您上面提到的方式对其进行了更改,现在可以使用了-