针对不同消费者的每条消息的Spring云流主题
我正在寻找的拓扑是 到目前为止,我还没有看到一种在云流中定义每条消息的主题的方法。我知道消费者将被绑定到特定的主题,但在将消息发送到exchange之前,制作人如何设置每条消息的主题针对不同消费者的每条消息的Spring云流主题,spring,spring-cloud,spring-cloud-stream,Spring,Spring Cloud,Spring Cloud Stream,我正在寻找的拓扑是 到目前为止,我还没有看到一种在云流中定义每条消息的主题的方法。我知道消费者将被绑定到特定的主题,但在将消息发送到exchange之前,制作人如何设置每条消息的主题 source.output().send(MessageBuilder.withPayload(myMessage).build()); 不提供任何方法来设置exchange路由到正确使用者的主题 或者也许我没有正确理解某些事情 更新 由于bindingRoutingKey为2222且我正在使用routeTo1
source.output().send(MessageBuilder.withPayload(myMessage).build());
不提供任何方法来设置exchange路由到正确使用者的主题
或者也许我没有正确理解某些事情
更新
由于bindingRoutingKey
为2222
且我正在使用routeTo
1111
发送,因此我预计不会在消费者中收到消息。但我还是在消费者身上收到它
生产者财产:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.stream.bindings.output.content-type=application/json
spring.cloud.stream.bindings.output.destination=messageExchange
spring.cloud.stream.rabbit.bindings.output.producer.routing-key-expression=headers['routeTo']
@EnableBinding(Source.class)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
发件人:
source.output().send(MessageBuilder.withPayload(mo).setHeader(“routeTo”,“1111”).build())代码>
消费者:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.stream.bindings.input.destination=messageExchange
spring.cloud.stream.rabbit.bindings.input.consumer.bindingRoutingKey=2222
应用程序:
@SpringBootApplication
@EnableBinding(Sink.class)
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@StreamListener(Sink.INPUT)
public void ReceiveMo(String moDTO) {
log.info("Message received moDTO: {}", moDTO);
}
}
第二次更新
下面接受答案中的建议。我能让它工作。需要使用RabbitMQ的UI从RabbitMQ中删除交换和队列,并重新启动RabbitMQ docker映像。路由键表达式
e、 g.…producer.routing key expression=headers['routeTo']
然后
请注意,目标是exchange名称。默认情况下,活页夹需要一个主题
交换。如果您希望使用直接交换,则必须设置exchangeType
属性。谢谢您的回答。我想使用主题交换可以(我就是找不到一张好的图片)。顺便说一下,在消费者方面,我可以使用逗号分隔的routinKeyExpression,如Booking.new.*、Orders.#。这是否正确?在使用者端,属性是bindingRoutingKey
,并且,不,活页夹仅支持使用单个键进行绑定。如果您需要更奇特的东西,您需要自己添加额外的队列/交换绑定。我尝试使用头routeTo
,并将bindingRoutingKey
设置为使用者,但似乎不起作用。我更新问题。如果您能指出我做错了什么,我将不胜感激。您检查过控制台上的绑定了吗?您是否删除了旧的(默认)绑定#
?您是对的!!!我需要从rabbitMQ中删除exchange/队列并重新启动它。现在,它正在按预期工作。还有一件事是我没有正确添加producer.routing-key-epxpression。尽管我可以在文档中看到它们,但这和bindingRoutingKey Eclipse都告诉我它们是未知的。但至少它起作用了!再次感谢你。我一直在寻找的是:)
source.output().send(MessageBuilder.withPayload(myMessage)
.setHeader("routeTo", "Booking.new")
.build());