大家.我有一个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); }
那么,什么是问题:被发送的消息,之后,它是由消费者消费及其响应正确发送到正确的队列中,但由于某种原因,没有在convertSendAndReceived方法和设置超时我receivedMessage后收回一片空白.于是,我就做几件事情 - 我开始检查春季代码(顺便说这是一个真正的噩梦做到这一点),看到是我不声明响应队列为我创建了一个时间,和ReplyTo头设置为队列的名称(与我的相同).结果是相同的 - receivedMessage仍为null.之后我决定使用另一个使用默认交换的模板,因为responseQueue绑定到该交换:
requestTemplate.send(routingKey, message); Message receivedMessage = receivingTemplate.receive(responseQueue.getName());
结果是相同的 - responseMessage仍为null.amqp和兔子的版本分别为1.2.1和1.2.0.所以我相信我会错过一些东西,但我不知道它是什么,所以如果有人可以帮助我,我将非常感激.