RabbitMQ等待超时消息

时间:2010-09-21 12:07:37

标签: rabbitmq

我想向RabbitMQ服务器发送消息,然后等待回复消息(在“回复”队列中)。当然,我不想永远等待处理这些消息的应用程序关闭 - 需要超时。这听起来像是一项非常基本的任务,但我找不到办法。我现在用Java API遇到了这个问题。

4 个答案:

答案 0 :(得分:2)

RabbitMQ Java客户端库现在http://spring.io/blog/2010/07/02/gorm-gotchas-part-2/

例如,RPC教程使用以下代码:

consumer.nextDelivery(1000)

现在,您可以使用null等待最多一秒钟。如果达到超时,则该方法返回channel.basicPublish("", requestQueueName, props, message.getBytes()); while (true) { // Use a timeout of 1000 milliseconds QueueingConsumer.Delivery delivery = consumer.nextDelivery(1000); // Test if delivery is null, meaning the timeout was reached. if (delivery != null && delivery.getProperties().getCorrelationId().equals(corrId)) { response = new String(delivery.getBody()); break; } }

{{1}}

答案 1 :(得分:0)

com.rabbitmq.client.QueueingConsumer有一个nextDelivery(long timeout)方法,可以做你想要的。但是,这已被弃用。 编写自己的超时并不是那么难,尽管拥有一个正在进行的线程和一个及时标识符列表可能会更好,而不是一直添加和删除使用者和关联的超时线程。

编辑添加:回复后注意到此日期!

答案 2 :(得分:0)

我通过创建一个对象来跟踪对特定消息的响应,使用C#解决了这个问题。它为消息设置唯一的回复队列,并订阅它。如果在指定的时间范围内未收到响应,则倒计时计时器将取消订阅,从而删除队列。另外,我有可以从我的主线程(使用信号量)或异步(使用回调)同步的方法来利用这个功能。

基本上,实现看起来像这样:

//Synchronous case:
//Throws TimeoutException if timeout happens
var msg = messageClient.SendAndWait(theMessage);

//Asynchronous case
//myCallback receives an exception message if there is a timeout
messageClient.SendAndCallback(theMessage, myCallback);

答案 3 :(得分:-1)

有类似的问题。虽然它的答案不使用java,但也许你可以得到一些提示。

Wait for a single RabbitMQ message with a timeout