Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对不同消费者的每条消息的Spring云流主题_Spring_Spring Cloud_Spring Cloud Stream - Fatal编程技术网

针对不同消费者的每条消息的Spring云流主题

针对不同消费者的每条消息的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

我正在寻找的拓扑是

到目前为止,我还没有看到一种在云流中定义每条消息的主题的方法。我知道消费者将被绑定到特定的主题,但在将消息发送到exchange之前,制作人如何设置每条消息的主题

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());