spring-amqp请求/回复消息的空响应

时间:2013-06-13 15:19:13

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

我正在按照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;
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您还应该删除MessagePostProcessor中的convertSendAndReceive,因为模板会处理自己的回复队列和关联配置。如果没有固定的回复队列,则不允许这样做。

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

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