我使用RabbitMQ web-UI创建了一个主题交换 TX 并绑定到交换机两个队列 TX.Q1 和 TX.Q2 ,相应地绑定了路由键 rk1 和 rk2 ,并向交易所发送了少量消息。
现在我想使用Spring Cloud Stream创建一个消费者,它只接收来自Q1的消息。 我尝试使用配置:
spring.cloud.stream.bindings.input.destination=TX
spring.cloud.stream.bindings.input.group=Q1
以及使用消息的方法的注释@StreamListner(Sink.INPUT)
。
结果我可以看到消费者创建了一个名为 TX.Q1 的队列(或绑定),但新队列/绑定的路由密钥是#。
如何通过Spring Cloud Stream配置消费者,消费者将使用来自预定义队列的消息(仅限于使用 rk1 路由的消息)。
答案 0 :(得分:5)
所以现在,Garry Russell建议的解决方案已经为我解决了这个问题。
我用@RabbitListener
代替@StreamListenet
这样:@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "TX.Q1", durable = "true"), exchange = @Exchange(value = "TX", type = "topic", durable = "true"), key = "rk1")
。
因此,预定义队列 TX.Q1 与绑定密钥绑定: rk1 到交换 TX 。
等待Spring Cloud Steream issue上的更新。
答案 1 :(得分:2)
我认为我使用@StreamListener
找到了解决方案,而不是使用解决方法。一切都是在配置中完成的,而不是在代码中完成的。
我使用的配置如下(位于.yml中,但是您可以轻松地将其转换为.properties):
spring:
cloud:
stream:
bindings:
input:
binder: <binder_name>
destination: TX
group: Q1
binders:
<binder_name>:
type: rabbit
environment:
spring:
rabbitmq:
host: <host>
port: <port>
virtual-host: <vhost>
username: <username>
password: <password>
rabbit:
bindings:
input:
consumer:
binding-routing-key: rk1
exchange-name: TX
queue-name-group-only: true
bind-queue: true
exchange-durable: true
exchange-type: topic
使用这种方法,您不必编写特定的代码即可让RabbitMQ使用者连接到您的集群,这可以解决您的情况。
希望这会有所帮助。
答案 2 :(得分:0)
Spring Cloud Stream在内部为使用者端点设置路由器密钥,使其成为目标名称(exchange
名称)本身,或者在静态分区的情况下基于partition
标头的路由。
我认为this github问题可能与您的案件有关。
答案 3 :(得分:0)
鼓励在消费者下使用此属性,以使Rabbit能够从现有队列中消费。请注意,仅从组属性中而不是从目的地中选择队列名称。
queueNameGroupOnly:正确
示例:
cloud:
stream:
# rabbit setting: https://github.com/spring-cloud/spring-cloud-stream-binder-rabbit
rabbit:
bindings:
input:
consumer:
acknowledgeMode: AUTO
bindingRoutingKey: DECISION_PERSISTENCE_KEY
declareExchange: false
bindQueue: false
queueNameGroupOnly: true
consumerTagPrefix: dpa-rabbit-consumer
bindings:
input:
binder: rabbit
group: DECISION_PERSISTENCE_QUEUE
content-type: application/json