针对不同消费者的每条消息的Spring Cloud Stream主题

时间:2018-05-05 14:57:41

标签: spring spring-cloud spring-cloud-stream

我正在寻找的拓扑是

enter image description here

到目前为止,我还没有看到在Cloud Stream中为每条消息定义主题的方法。我理解消费者将受到特定主题的约束,但生产者如何在将消息发送到交易所之前为每条消息设置主题?

source.output().send(MessageBuilder.withPayload(myMessage).build());

不提供任何方法来设置交换主题以路由到适当的消费者。

或许我对某些事情没有正确理解?

更新

由于bindingRoutingKey2222并且我发送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);
}

}

第二次更新

根据下面接受的答案中的建议。我能够让它发挥作用。需要使用UI从RabbitMQ中删除交换和队列,然后重新启动RabbitMQ docker镜像。

1 个答案:

答案 0 :(得分:2)

routingKeyExpression rabbitmq producer property

e.g。 ...producer.routing-key-expression=headers['routeTo']

然后

source.output().send(MessageBuilder.withPayload(myMessage)
    .setHeader("routeTo", "Booking.new")
    .build());

请注意,目的地是交换名称。默认情况下,活页夹需要进行Topic交换。如果您希望使用直接交换,则必须设置exchangeType属性。