2

RabbitMQ amqp-client ライブラリでキャンセルすることは可能nextDeliveryですか? 既に を呼び出しているスレッドがありconsumer.nextDelivery()、この呼び出しはキューからの応答を待っています。私が望むのは、これを別のスレッドから停止することです。channel.basicCancelアプリケーションが受信した配信で何もできない状態にあるため、現在の呼び出しが返された後にのみキャンセルされnextDeliveryますが、これはまさに私が望むものではありません。

私はしばらくこれに対する解決策を探していましたが、問題に一致する検索結果が得られないため、RabbitMQ について何か誤解していると思うところまで来ました。

4

2 に答える 2

0

これが機能するかどうかはわかりませんが、次を使用してみてshutdownNow()くださいExecutorService

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

ShutdownNow() の javadoc の状態:

アクティブに実行中のすべてのタスクの停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。このメソッドは、アクティブに実行中のタスクが終了するのを待ちません。そのために awaitTermination を使用します。

アクティブに実行中のタスクの処理を停止するための最善の努力以外の保証はありません。たとえば、典型的な実装は Thread.interrupt() によってキャンセルされるため、割り込みに応答しないタスクは決して終了しない可能性があります。

于 2013-07-07T10:37:58.160 に答える