私はいくつかのキューにメッセージを送信するメソッドproducer.postMessage(メッセージ)を持っています。何らかの理由で一定期間内にメッセージを送信できなかった場合は、このタスクをキャンセルする必要があります。私は以下の実装を思いついた。私の質問は、割り込みがある場合は、未来のタスク/エグゼキュータサービスがすべてシャットダウンされていることを確認することができますし、終了していないスレッドなしでこれを動作させるために必要な変更はありません。たくさんスレッドが確実にクリーンアップされる方法
public void postMessage(final Object object)
{
LOG.debug("postMessage object " + object.getClass().getSimpleName());
Message message = new Message("task", 10, object);
try
{
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable()
{
public void run()
{
producer.postMessage(message);
LOG.debug("Finished sending message for " + object.getClass().getSimpleName());
}
});
f.get(5, TimeUnit.SECONDS);
ex.shutdown();
}
catch (InterruptedException | ExecutionException | TimeoutException e)
{
LOG.error("Could not deliver message to the queue, Check AMQ is running");
}
}
はなぜ代わりに 'shutdown'方法の' shutdownNow'を使用していませんか?また、 'isTerminated'メソッドは、すべてのタスクの正常終了をチェックするために使用できます。 –