使用Spring amqp库的请求 - 响应模式

 隆重黄_927 发布于 2023-01-02 16:06

大家.我有一个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.所以我相信我会错过一些东西,但我不知道它是什么,所以如果有人可以帮助我,我将非常感激.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有