java - 如何使用rabbitTemplate receiveAndReply

标签 java spring rabbitmq spring-rabbit

我刚刚开始尝试 Spring 和rabbitMQ。 我想用rabbit和spring创建一个微服务基础设施, 我一直在关注Spring boot tutorial

但这非常简单。我也在查看文档( springsRabbit )以了解如何创建 RPC,我了解 Rabbits 方法,但我想利用 Spring 模板来保存样板文件。

我似乎无法理解在哪里注册 receiveAndReplay 回调。

我尝试这样做:

正在发送

    System.out.println("Sending message...");
    Object convertSendAndReceive = rabbitTemplate.convertSendAndReceive("spring-boot", "send and recive: sent");
    System.out.println("GOT " + convertSendAndReceive); //is null        

正在接收

@Component
public class Receiver {
@Autowired
RabbitTemplate rabbitTemplate;
public void receiveMessage(String message) {
    this.rabbitTemplate.receiveAndReply("spring-boot", (Message)->{
        return "return this statement";
    });
}
}

但这不起作用,收到消息但没有返回,这并不奇怪。我认为这需要在 bean 创建级别的工厂/模板中的某个位置注册,但我似乎不明白在哪里,遗憾的是文档不清楚。

最佳答案

首先,请使用Spring AMQP Documentation .

您通常会使用与 POJO 监听器连接的 SimpleMessageListenerContainer 进行 RPC。

模板 receiveAndReply 方法适用于“预定的”服务器端 RPC - 即仅在您想要的时候接收(和回复),而不是每当消息到达队列时。它不会阻塞等待消息。

如果你想使用receiveAndReply(),有一个test case that illustrates it .

编辑:

这段代码...

    this.template.convertAndSend(ROUTE, "test");

向队列发送消息。

这段代码...

    this.template.setQueue(ROUTE);
    boolean received = this.template.receiveAndReply(new ReceiveAndReplyMessageCallback() {

        @Override
        public Message handle(Message message) {
            message.getMessageProperties().setHeader("foo", "bar");
            return message;
        }
    });

从该队列接收消息;添加 header 并将相同的消息返回到回复队列。如果没有消息要接收(和回复),received 将为 false。

这段代码:

    Message receive = this.template.receive();

收到回复。

这个测试有点人为,因为回复被发送到与请求相同的队列。在此测试中,我们无法在客户端使用 sendAndReceive(),因为线程会阻塞等待回复(并且我们需要执行 receiveAndReply())。

Another test in that class有一个更实际的示例,它在不同线程上执行 sendAndReceive() ,并在主线程上执行 receiveAndReply()

请注意,该测试使用客户端的监听器容器进行回复;通常不再需要,因为兔子经纪人现在支持 direct reply-to .

receiveAndReply() 是为了对称性而添加的 - 在大多数情况下,人们使用监听器容器和监听器适配器来进行服务器端 RPC。

关于java - 如何使用rabbitTemplate receiveAndReply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596119/

相关文章:

java - 简单的 Spring Boot 应用程序的 ResourceLoader null

RabbitMQ (3.2.x) 管理插件产生 Javascript (TypeError or undefined) 错误

Java "2D-array"问题

java - 菜鸟问题 - 我可以编写一个脚本来为我们的内部云软件执行操作吗?

java - 将 Elasticsearch 与 Spring Boot 结合使用时出错

python - 多服务器生产环境中的django-celery

python - Celery 为什么任务停留在队列中

java - 如何在AsyncTask中传递方法?

java - 当我将quarkus适配到一个简单的spring boot项目时出现“No Spring WebApplicationInitializer types detected on classpath”?

java - 在 Spring 集成中将字符串对象发送到休息服务时 ConverterNotFoundException