Hri*_*lov 5 spring rabbitmq spring-amqp
大家.我有一个HTTP API用于在RabbitMQ代理中发布消息,我需要实现请求 - 响应模式,以便从服务器接收响应.所以我就像是客户端和服务器之间的桥梁.我使用特定的路由密钥将消息推送到代理,并且有消息用于消息,它将按摩作为响应发布回来,我的API必须消耗每个请求的响应.所以图表是这样的:

所以,我做的是以下各项为我创建一个临时responseQueue每一个HTTP会话(这势必会默认交换与路由的关键是队列的名称),在那之后我设置了消息的ReplyTo头是名响应队列(我将等待响应),并将模板replyQueue设置为该队列.这是我的代码:
public void sendMessage(AbstractEvent objectToSend, final String routingKey) {
final Queue responseQueue = rabbitAdmin.declareQueue();
byte[] messageAsBytes = null;
try {
messageAsBytes = new ObjectMapper().writeValueAsBytes(objectToSend);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
MessageProperties properties = new MessageProperties();
properties.setHeader("ContentType", MessageBodyFormat.JSON);
properties.setReplyTo(responseQueue.getName());
requestTemplate.setReplyQueue(responseQueue);
Message message = new Message(messageAsBytes, properties);
Message receivedMessage = (Message)requestTemplate.convertSendAndReceive(routingKey, message);
}
Run Code Online (Sandbox Code Playgroud)
那么,什么是问题:被发送的消息,之后,它是由消费者消费及其响应正确发送到正确的队列中,但由于某种原因,没有在convertSendAndReceived方法和设置超时我receivedMessage后收回一片空白.于是,我就做几件事情 - 我开始检查春季代码(顺便说这是一个真正的噩梦做到这一点),看到是我不声明响应队列为我创建了一个时间,和ReplyTo头设置为队列的名称(与我的相同).结果是相同的 - receivedMessage仍为null.之后我决定使用另一个使用默认交换的模板,因为responseQueue绑定到该交换:
requestTemplate.send(routingKey, message);
Message receivedMessage = receivingTemplate.receive(responseQueue.getName());
Run Code Online (Sandbox Code Playgroud)
结果是相同的 - responseMessage仍为null.amqp和兔子的版本分别为1.2.1和1.2.0.所以我相信我会错过一些东西,但我不知道它是什么,所以如果有人可以帮助我,我将非常感激.
1>如果你RabbitTemplate提供. 看起来你的解释是错误的。doSendAndReceiveWithFixedrequestTemplate.setReplyQueue(responseQueue)
2> 要使其修复,ReplyQueue您应该配置reply ListenerContainer:
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory);
container.setQueues(responseQueue);
container.setMessageListener(requestTemplate);
Run Code Online (Sandbox Code Playgroud)
3> 但这里最重要的部分是围绕correlation. 填充消息属性,但消费者端也必须处理它:仅向 发送回复是不够的,回复消息应该具有相同的RabbitTemplate.sendAndReceive属性。请参阅此处:如何使用 Spring AMQP 将特定请求的响应从消费者发送到生产者?correlationIdresponseQueuecorrelationId
顺便说一句,没有理由Message手动填充:您只需支持Jackson2JsonMessageConverter即可RabbitTemplate,它会objectToSend使用适当的标头自动将您的数据转换为 JSON 字节。
| 归档时间: |
|
| 查看次数: |
3639 次 |
| 最近记录: |