使用Spring和RabbitMQ实现具有已存在队列的请求/回复模式

时间:2017-06-17 23:03:19

标签: spring-boot rabbitmq spring-rabbit spring-rabbitmq rabbitmq-exchange

首先让我来描述一下这个系统。有2个应用程序,我们称之为客户端服务器。还有2个队列,请求队列和回复队列。 客户端发布到请求队列,服务器侦听该请求以处理它。在服务器处理邮件后,它会将邮件发布到客户端订阅的回复队列。 服务器应用程序始终将回复发布到预定义的回复队列,而不是客户端应用程序确定的队列。

我无法对服务器应用程序进行更新。我只能更新客户端应用程序。队列由服务器应用程序创建和管理。

我正在尝试从客户端实施请求/回复模式,以便同步返回来自服务器的回复。我知道spring的“sendAndReceive”方法,以及它如何与临时队列一起用于回复目的,以及固定的回复队列。

Spring AMQP - 3.1.9 Request/Reply Messaging

以下是我的问题:

  1. 我可以将此方法用于由服务器应用程序管理和创建的现有队列吗?如果是,请详细说明。
  2. 如果我的客户端应用程序是一个缩放的应用程序(它的多个实例同时运行),那么我该如何以这种方式实现它,即错误的实例(一个在请求没有发出的请求没有从队列中读取回复?
  3. 除了路由键之外,我能否在这里使用“默认”交换?
  4. 感谢您的时间和回复。

1 个答案:

答案 0 :(得分:0)

  1. 是;只需使用Reply Listener Container连接到RabbitTemplate
  2. 即可

    重要信息:服务器必须回显客户端设置的correlationId消息属性,以便可以将回复与客户端中的请求相关联。

    1. 你不能。与JMS不同,RabbitMQ没有消息选择的概念;每个使用者(在这种情况下,回复容器)都需要自己的队列。否则,实例将获得随机回复,并且很可能(很有可能)回复将转到错误的实例。
    2.   

      ...它将其发布到回复队列......

      使用RabbitMQ,发布者不会发布到队列,而是使用路由密钥发布到交换机。将发布者与队列紧密联系是不好的做法。如果您无法更改服务器以将回复发布到交换机,并且路由密钥包含来自请求消息的内容(或使用replyTo属性),那么您就不在运气。

      1. 使用默认交换鼓励我在2中提到的不良做法(将生产者紧密耦合到队列)。所以,不,它没有帮助。
      2. 修改

        如果回复中有某些内容允许您将其与请求相关联;一种可能性是在服务器的回复队列中添加委派使用者。收到回复,执行相关,将回复路由到正确的replyTo