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

时间:2019-07-09 16:19:21

标签: rabbitmq spring-cloud-stream

我正在构建一个基于SpringCloud Stream的应用程序,并且交换类型为主题,并且消息从主题交换发送到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());
     }

我在服务之间的通信不起作用。

1 个答案:

答案 0 :(得分:1)

appointments.#.#

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

您需要类似的东西

spring.cloud.stream.rabbit.bindings.output.producer.routingKeyExpression=headers['routingKey']

然后,生产者将routingKey头设置为每个消息的期望值。

您不应该真正使用Simp标头;这是针对STOMP的;使用您自己的标题。