Spring AMQP 使用 noLocal 消费者使用临时队列发送和接收

Posted

技术标签:

【中文标题】Spring AMQP 使用 noLocal 消费者使用临时队列发送和接收【英文标题】:Spring AMQP send & receive with temporary queues using a noLocal consumer 【发布时间】:2018-08-08 06:11:37 【问题描述】:

当使用临时队列发送和接收时,会创建一个消费者,并将noLocal 属性设置为true(请参阅RabbitTemplate#doSendAndReceiveWithTemporary method line 1297 of version 1.7.4.RELEASE)。

根据javadocs for the basicConsume method,当这个属性设置为true,那么“服务器不应该把发布在这个频道的连接上的消息传递给这个消费者”

现在,据我所知,这个消费者正在设置为实际接收回复消息。如果我是正确的,那么由于noLocal 属性设置为true,难道不应该收到回复not吗?

当使用 RabbitMQ 作为 AMQP 代理时,可以正常接收回复消息。但是,当使用 Apache Qpid 时,没有收到回复。实际上,只有当noLocal属性设置为false时才会收到。

【问题讨论】:

经过更多研究后,我发现这篇文章 (rabbitmq.com/interoperability.html#qpid-python-tests) 指出 RabbitMQ 不支持非本地消费者。尽管如此,问题仍然存在,如果 RabbitMQ 支持,那么是否应该收到回复? 【参考方案1】:

让服务器端与客户端在同一个应用程序中运行有点不寻常。这是 no-local 影响这种情况的唯一方式,因为通常客户端不会发布回复。

我们不声称与 QPID(当然不是 AMQP 1.0)兼容,但我看到 QPID 声称支持 AMQP 0.9.x,因此请随时打开JIRA Issue,我们会在时间允许的情况下进行查看。

【讨论】:

感谢您的回复。这实际上发生在使用 qpid 作为嵌入式 amqp 代理的 Spring Boot 测试期间。因此,就我而言,我的服务器和客户端都在同一个应用程序中运行。我已经打开了一个 github 问题 (github.com/spring-projects/spring-amqp/issues/712)。这样就够了吗?

以上是关于Spring AMQP 使用 noLocal 消费者使用临时队列发送和接收的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Integration 和 AMQP,我可以创建竞争消费者的 Pub-Sub 组吗?

Spring使用Spring和AMQP发送接收消息(上)

Spring消息之AMQP.

Spring AMQP RPC消费者并抛出异常

Spring AMQP RPC使用者如何确定发布者通道是不是已关闭

消息队列客户端开发向导二(基于 Spring 的 amqp 实现)