如何为生产者设置路由密钥

时间:2017-04-04 19:49:30

标签: spring-cloud spring-cloud-stream

我有基于Spring Cloud Stream的应用程序的以下测试场景。 我有一个主题,我的应用程序有两个队列。第一个队列的BindingKey命名为" cities",第二个队列是绑定密钥" persons"。

请如何为Spring Cloud Stream Rabbit生产商设置路由密钥???区分消息将被消费的位置?

这是我的绑定配置:

spring.config.name=streaming

spring.cloud.stream.bindings.citiesChannel.destination=streamInput
spring.cloud.stream.bindings.citiesChannel.group=cities
spring.cloud.stream.rabbit.bindings.citiesChannel.consumer.durableSubscription=true
spring.cloud.stream.rabbit.bindings.citiesChannel.consumer.bindingRoutingKey=cities

spring.cloud.stream.bindings.personsChannel.destination=streamInput
spring.cloud.stream.bindings.personsChannel.group=persons
spring.cloud.stream.rabbit.bindings.personsChannel.consumer.durableSubscription=true
spring.cloud.stream.rabbit.bindings.personsChannel.consumer.bindingRoutingKey=persons

spring.cloud.stream.bindings.producingChannel.destination=streamInput

在发布到 produceChannel 时,如何区分邮件发送位置(城市或人员队列)的唯一方法是通过" spring.cloud.stream.bindings.producingChannel。 producer.requiredGroups" 属性,但高度不可用。因为我不想知道我的消息将要落地的队列......这是AMPQ反模式。

我想要更简单,然后在发布到produceChannel时通过 RabbitTemplate.setRoutingKey(String routingKey)方法获得类似的功能...: - (

4 个答案:

答案 0 :(得分:3)

在制作人方面使用routingKeyExpression - 请参阅the documentation

因为它是一个表达式,所以你需要引号:'cities'或者如果同一个制作人发送给两者,例如headers['whereToSendHeader']

答案 1 :(得分:1)

是的,非常感谢。

添加

spring.cloud.stream.rabbit.bindings.producingChannel.producer.routingKeyExpression='persons'

导致消息落入streaming.persons队列和

spring.cloud.stream.rabbit.bindings.producingChannel.producer.routingKeyExpression='cities'

在streaming.cities队列中。正是我想要的。

谢谢。似乎我们将在项目中使用Spring Cloud Stream ..: - )

答案 2 :(得分:0)

对于我们这些使用yaml的人:

spring:
  cloud:
    stream:
      rabbit:
        bindings:
          somechannel:
            producer:
              bindingRoutingKey: routingKey
              routing-key-expression: '"routingKey"'

Source

请注意上面的bindingRoutingKey - 如果您希望在使用 spring.cloud.stream.bindings.someChannel.producer.requiredGroups

时在生产者启动时绑定您的队列,则使用此方法。

答案 3 :(得分:0)

另一种(AMQP不可知)的方法是使用动态目标支持,即http://docs.spring.io/autorepo/docs/spring-cloud-stream-docs/Chelsea.SR2/reference/htmlsingle/#dynamicdestination

Rabbit的主要区别在于您最终会有2个独立的交换('城市'和#39;人员') - 所以它不利用路由支持,但它可以移植到其他消息系统,例如Kafka。