На днях я внедрил важный сервис в своем приложении, который должен продолжать работать, несмотря ни на что. Поэтому я использовал следующую конструкцию:
ScheduledExecutorService ses =
Executors.newSingleThreadScheduledExecutor();
//If the thread dies, another will take over
ses.scheduleAtFixedRate(importantPeriodicTask, 1, 1, TimeUnit.NANOSECONDS);
... только для того, чтобы выяснить, что, когда важныйPeriodicTask автоматически генерирует RuntimeException или Error, ScheduledExecutorService
прекращает выполнение этой задачи (они перестают планироваться).
Это, конечно, именно то, что говорит Javadoc:
При любом выполнении задания
встречает исключение, последующее
казни подавлены.
Мне так стыдно, но я не мог понять, почему авторы реализовали ScheduledExecutorService
таким образом.
Конечно, RuntimeException или Error обычно не должны быть обнаружены, особенно Error. Но на самом деле, особенно в случае RuntimeException, правда заключается в том, что они используются довольно часто при развертывании в производственной среде, и я чувствую, что почти всегда желательно, чтобы, хотя эта конкретная операция не выполнялась, само приложение не должно было работать из-за этой изолированной ошибки.
Это правда, что подавление одной периодической задачи не влияет на другие виды периодических задач. Но учитывая природу большинства периодических задач, не должны ли эти задачи восприниматься как «услуга», а не как отдельные задачи?
Другими словами, должен ли сбой не только один экземпляр importantPeriodicTask
, а само задание продолжать перепланировать?