我正在按照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;
}
答案 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
。确保在两个地方使用相同的队列(解析器在使用命名空间时会处理这个问题)。