、私は(シングルスレッドで)Timer
とScheduledThreadPoolExecutor
を見てreference for Executors.newSingleThreadScheduledExecutor()
で、それが言うので、後者を使用することにしました:例外がスローされた後にScheduledExecutorServiceがタスクを再度実行しないのはなぜですか?定期的なタスクを実行するための
注しかし、この単一スレッドがのために終了した場合シャットダウン前に実行中に障害が発生した場合、後続のタスクを実行するために必要に応じて新しいものが使用されます。
これは、他の操作を監視したいウォッチドッグコードの未捕捉例外に対する保護手段として使用することでした。私は以下のテストを確実にして書いたかったのですぐに失敗しました。私は間違った前提をしていたか、私のテストについて何か間違っているようですか?繰り返しタスクは、エラー状態で死亡したりもしていると想定されて捕捉されない例外をスローしたら
@Test
public void testTimer() {
final AtomicInteger cTries = new AtomicInteger(0);
final AtomicInteger cSuccesses = new AtomicInteger(0);
TimerTask task = new TimerTask() {
@Override
public void run()
{
cTries.incrementAndGet();
if (true) {
throw new RuntimeException();
}
cSuccesses.incrementAndGet();
}
};
/*
Timer t = new Timer();
t.scheduleAtFixedRate(task, 0, 500);
*/
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
exe.scheduleAtFixedRate(task, 0, 500, TimeUnit.MILLISECONDS);
synchronized (this) {
try {
wait(3000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
exe.shutdown();
/*
t.purge();
*/
Assert.assertEquals(cSuccesses.get(), 0);
Assert.assertTrue(cTries.get() > 1, String.format("%d is not greater than 1. :(", cTries.get()));
}
私は知っている、私はものの周りにキャッチ(Throwable)をラップすることができますが、私の計画は何とか自分自身から私を保護することでした。 –
このようなフレームワーク・コードでは、失敗したジョブを安全に再開できると仮定するのは問題になります。例外で失敗したということは、データがあらゆる状態のまま残っている可能性があり、仕事。 –
新しいスレッドの開始についての引用は、失敗しても他のジョブの実行を継続できるようにすることです。 –