我正在构建一个基于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());
}
我在服务之间的通信不起作用。
答案 0 :(得分:1)
appointments.#.#
您不能在生产者端使用通配符。
您需要类似的东西
spring.cloud.stream.rabbit.bindings.output.producer.routingKeyExpression=headers['routingKey']
然后,生产者将routingKey
头设置为每个消息的期望值。
您不应该真正使用Simp标头;这是针对STOMP的;使用您自己的标题。