【发布时间】:2020-07-02 11:00:38
【问题描述】:
我正在尝试使用 Java 代码使用来自 RabbitMQ 通道的消息。我调用了 myAction() 方法两次,它只在第一次时按预期工作。
private Channel receiveChannel=//...;
String myAction() {
var wrapper = new Object(){ String message = null; };
final CountDownLatch countDownLatch = new CountDownLatch(1);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
wrapper.message = new String(delivery.getBody(), "UTF-8");
countDownLatch.countDown();
log.info("Received response '" + wrapper.message + "'");
};
receiveChannel.basicConsume(recvQueueKey, true, deliverCallback, consumerTag -> {});
if(!countDownLatch.await(10000, TimeUnit.MILLISECONDS)) {
fail();
}
return wrapper.message;
}
基本上,我的目标是消费并让myAction() 返回消息内容。我第二次调用myAction() 时发生的情况是log.info("Received response.. 被打印但countDownLatch 没有递减,导致fail() 被执行。有谁知道我错过了什么?符合这一点,是不是消费和返回消息内容的正确方式?感谢您的帮助。
【问题讨论】:
-
我不是 RabbitMQ 专家,但你确定第二个“Received..”消息没有被第一个 DeliverCallback 打印出来吗?尝试在创建回调时为其添加唯一 ID。您正在创建的消费者的生命周期是多久?
-
感谢您的回复。是的,我确定
标签: java rabbitmq countdownlatch