RabbitMQ amqp-client库是否可以取消nextDelivery
?我有一个已调用consumer.nextDelivery()
的线程,此调用正在等待队列的响应。我想要的是从另一个线程中阻止它。 channel.basicCancel
仅在当前nextDelivery
调用返回后才会取消,这不是我想要的,因为应用程序处于无法对收到的传递执行任何操作的状态。
我一直在寻找解决这个问题的方法,而且我认为我对RabbitMQ有些误解,因为我没有得到与我的问题相符的搜索结果。
答案 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();
// ...
}
});
尝试停止所有正在执行的任务,停止处理 等待任务,并返回正在等待的任务列表 执行。此方法不等待主动执行任务 终止。使用awaitTermination来做到这一点。
除了努力尝试停止处理之外,没有任何保证 积极执行任务。例如,典型的实现方式 通过Thread.interrupt()取消,因此任何无法响应的任务 中断可能永远不会终止。