RabbitMQ - 在等待响应时取消consumer.nextDelivery

时间:2013-07-07 10:24:13

标签: java rabbitmq amqp

RabbitMQ amqp-client库是否可以取消nextDelivery?我有一个已调用consumer.nextDelivery()的线程,此调用正在等待队列的响应。我想要的是从另一个线程中阻止它。 channel.basicCancel仅在当前nextDelivery调用返回后才会取消,这不是我想要的,因为应用程序处于无法对收到的传递执行任何操作的状态。

我一直在寻找解决这个问题的方法,而且我认为我对RabbitMQ有些误解,因为我没有得到与我的问题相符的搜索结果。

2 个答案:

答案 0 :(得分:1)

  

我想要的是从另一个线程中阻止它

个人建议:不要这样做。

根据评论中收集的信息,您似乎将消息接收与其处理分开。我的建议是合并两者;并使用ExecutorService将它们包装起来。

当您需要关闭整个事件时,请在.shutDown()上调用ExecutorService:这意味着不能将任何其他任务提交给该执行。

由于接收/处理过程现已合并,这意味着您永远不会有接收消息但无法再处理的状态。

答案 1 :(得分:0)

我不确定这是否有效,但尝试使用shutdownNow()的{​​{1}}:

ExecutorService
private ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new Runnable()
{
    @Override
    public void run()
    {
        // ...
        Message m = consumer.nextDelivery();
        // ...
    }
});

ShutdownNow()'s javadoc州:

  

尝试停止所有正在执行的任务,停止处理   等待任务,并返回正在等待的任务列表   执行。此方法不等待主动执行任务   终止。使用awaitTermination来做到这一点。

     

除了努力尝试停止处理之外,没有任何保证   积极执行任务。例如,典型的实现方式   通过Thread.interrupt()取消,因此任何无法响应的任务   中断可能永远不会终止。