【问题标题】:Null response for spring-amqp Request/Reply Messagingspring-amqp 请求/回复消息的空响应
【发布时间】:2013-06-13 15:19:13
【问题描述】:

我正在按照Stock Trading 示例的说明进行操作,该示例概述了如何在spring-amqp 中使用请求/回复消息:http://static.springsource.org/spring-amqp/docs/1.2.x/reference/html/sample-apps.html#d4e742

我已调整示例说明以创建一个客户端,该客户端应使用convertSendAndReceive 而不是convertAndSend 等待回复:https://gist.github.com/pulkitsinghal/5774487

现在,即使回复已放在 responseQueue 上,并且我已将超时 rabbitTemplate.setReplyTimeout(60000); 更新为比默认的 5 秒长……在我的客户端中,我收到了 null 作为回复。

有人知道怎么回事吗?


更新#1

有人建议我将<reply-listener/> 添加到<rabbit:template/>,但我不确定如何以编程方式执行此操作:

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
    rabbitTemplate.setMessageConverter(jsonMessageConverter());
    rabbitTemplate.setReplyQueue(responseQueue());
    rabbitTemplate.setReplyTimeout(60000);
    // following is private
    //rabbitTemplate.addListener
    return rabbitTemplate;
}

【问题讨论】:

  • 我希望你没有使用 spring 1.2。
  • 我已经为org.springframework.amqp.spring-rabbit 尝试了<version>1.1.4.RELEASE</version><version>1.2.0.BUILD-SNAPSHOT</version> 这两个版本......但它们都有相同的行为。
  • 我不是要回答你的问题。 Spring 现在是 3.2.3 版本,你真的不应该使用过时的库。
  • 是的,我基于spring-rabbit 的依赖层次结构在3.1.x 上,而且我没有任何理由跳到3.2.3 没有充分的理由这样做。我认为文档 URL 可能让你失望了……文档 url 捕获了 spring-rabbit 的版本号,而不是 spring 本身。

标签: java rabbitmq amqp spring-amqp spring-rabbit


【解决方案1】:

我假设你在convertsendAndReceive 上没有收到错误意味着你已经为RabbitTemplate 配置了一个固定的回复队列;如果这样做,则需要一个侦听器容器来接收带有模板作为“侦听器”的消息。

最简单的配置方法是使用 xml

<rabbit:template ... reply-queue="foo">
    <reply-listener/>
</rabbit:template>

我建议你先让它在没有固定回复队列的情况下工作 - 让模板创建自己的回复队列。

您还应该删除convertSendAndReceive 中的MessagePostProcessor,因为模板会处理自己的回复队列和相关配置。当没有固定的回复队列时,这是不允许的。

当您切换到使用固定回复队列时,我建议您使用 1.2.0.M1(或快照),因为该模板使用了非标准的关联技术。

更新:要使用 @Bean 配置而不是 XML,只需创建一个 SimpleMessageListenerContainer bean 并将其侦听器设置为 RabbitTemplate。只需确保在两个地方都使用相同的队列(解析器在使用命名空间时会处理这一点)。

【讨论】:

  • 谢谢加里,我今天早上开始使用1.2.0.BUILD-SNAPSHOT……但对我来说非常重要的是,我在我调用convertsendAndReceive的地方得到了回复……如果我配置了@987654331 @ 然后 MessageListenerAdapter 将让实现 handleMessage 的 POJO 控制流程......这在调用 convertsendAndReceive 的代码块周围无处可寻......还是我误解了你? &lt;reply-listener/&gt;&lt;listener/&gt; 有区别吗?
  • Gary 我盯着TemplateParser,它在第 109 行的 xml 文件中配置了 &lt;reply-listener/&gt;,但对于我来说,我无法弄清楚如何以编程方式在@Configuration 文件而不是 xml 文件中...您能看看我的答案中的更新并对此发表评论吗?
  • 您只需要声明一个SimpleMessageListenerContainer,其中messageListener 属性是接收回复的RabbitTemplate
  • 谢谢,我有点转过来了,我以为我必须在RabbitTemplate 上设置一个属性,但现在我明白它是相反的。
  • 您介意打开一个“文档”JIRA 问题吗? jira.springsource.org/browse/AMQP
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多