先日、アプリケーションに重要なサービスを実装していましたが、それは何があっても実行し続けるはずです。そこで、次の構成を使用しました。
ScheduledExecutorService ses =
Executors.newSingleThreadScheduledExecutor();
//If the thread dies, another will take over
ses.scheduleAtFixedRate(importantPeriodicTask, 1, 1, TimeUnit.NANOSECONDS);
...importantPeriodicTaskがRuntimeExceptionまたはErrorを実際にスローすると、ScheduledExecutorService
はこのタスクの実行を停止します(スケジュールされなくなります)。
もちろん、これはまさにjavadocが言っていることです。
タスクの実行で例外が発生した場合、それ以降の実行は抑制されます。
恥ずかしいのですが、なぜ作者ScheduledExecutorService
がこのように実装したのか理解できませんでした。
確かに、RuntimeExceptionまたはError、特にErrorは通常はキャッチされません。しかし実際には、特にRuntimeExceptionの場合、実際のデプロイメントでは非常に一般的にスローされます。その特定の操作は失敗するはずですが、その孤立したエラーのためにアプリ自体が失敗しないことがほとんどの場合望ましいと思います。
ある周期的なタスクの抑制が他の種類の周期的なタスクに影響を与えないのは事実です。しかし、ほとんどの定期的なタスクの性質を考えると、これらのタスクは、孤立したタスクではなく、「サービス」として認識されるべきではありませんか?
つまり、その1つのインスタンスだけがimportantPeriodicTask
失敗し、タスク自体のスケジュールが変更され続けるべきではないでしょうか。