当前位置: 首页 > 知识库问答 >
问题:

使用Spring云流将RabbitMQ使用者绑定到现有队列

袁奇文
2023-03-14

我使用RabbitMQ网络创建了一个主题交换UITX并绑定到交换两个队列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路由的消息)。

共有3个答案

吕俊才
2023-03-14

Spring Cloud Stream在内部将消费者endpoint的路由器密钥设置为目标名称(交换名称)本身,或者在静态分区的情况下基于分区标头的路由。

我认为这个github问题可能与您的案例有关。

微生恩
2023-03-14

我想我是使用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使用者连接到您的集群,这应该可以解决您的问题。

希望这有帮助。

康秋月
2023-03-14

所以现在,加里·拉塞尔建议的解决方案已经为我解决了这个问题

我用RabbitListener代替了streamlistener(绑定=@QueueBinding(value=@Queue(value=“TX.Q1”,durable=“true”)、exchange=@exchange(value=“TX”,type=“topic”,durable=“true”)、key=“rk1”)

因此,预定义队列TX.Q1使用绑定键rk1绑定到exchange TX。

正在等待Spring Cloud Steream问题的更新。

 类似资料:
  • 假设我希望实现与在spring-amqp函数周围使用时基本相同的功能: 在Rabbit绑定器中使用Spring Cloud Stream时,是否必须手动将消息访问到RabbitMQ? 如果是,如何实现?

  • 我对Spring和RabbitMQ有以下配置: 为了防止这种情况,我想创建持久队列(因为这些队列的持久度设置为false,自动删除设置为true)。如果不是,我想在这些队列上设置一些过期时间(例如,1小时或其他时间)。从RabbitMQ文档来看,我们似乎可以在头中传递这些值,但是,这只适用于版本3.6.0以后的版本,因为我们有3.5.4,它不是一个选项。 有没有其他方法可以配置它?(另一种方法是为

  • 现有的身份可以通过API或命令行发放给参与者。一旦现有的身份被绑定,参与者就可以使用该身份在该参与者的上下文中与业务网络进行交互。 使用{[site.data.conrefs.hlf_full}}时,可以绑定使用{[site.data.conrefs.hlf_full}}证书颁发机构(CA)创建的现有证书,或使用其他工具如cryptogen。现有证书必须有效用于在{[site.data.conre

  • 有没有一种方法可以限制RabbitMQ队列只将固定数量的消息从队列发送给使用者? 关于这一问题的更多背景资料: 为什么一次只处理2条消息?:Q2消息正在执行web服务调用,而web服务endpoint(第三方)只能同时服务2个消息。 我们不能使用并发吗?:如果我们使用ListenerContainer(Spring AMQP),则容器是每个消费者的。我们可以限制一个消费者一次可以获取多少消息,但是

  • 我正在开发一个使用Spring Boot版本2.0.4的Java应用程序。RELEASE和RabbitMQ版本3.7.7。该应用程序正在Redis数据库中缓存RabbitMQ中的所有消息,并且在RabbitMQ中创建新队列时必须重新发送。目前,我设法使用Event Exchange Plugin和队列名称捕获了队列创建。我正在使用AMQP出站适配器将消息发送回RabbitMQ。 流出 我可以使用r