Должны ли методы ScheduledExecutorService.scheduleAt * перепланировать задачи, если задача вызывает RuntimeException / Error? - PullRequest
2 голосов
/ 22 июля 2010

На днях я внедрил важный сервис в своем приложении, который должен продолжать работать, несмотря ни на что. Поэтому я использовал следующую конструкцию:

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, а само задание продолжать перепланировать?

1 Ответ

3 голосов
/ 22 июля 2010

На мой взгляд, текущее поведение разумно.RuntimeExceptions обычно ссылаются на ошибки.Они могут встречаться практически в любом месте кода задачи.Если задача, например, с состоянием, она может оставить свое состояние несовместимым, и последующие выполнения будут иметь неожиданное поведение.В целом, мне не нравится код, который пытается восстановиться из собственных ошибок, но это мое мнение.

Если вы хотите изменить поведение ScheduledExecutorService, взгляните на следующее общее решение:

http://www.javaspecialists.eu/archive/Issue154.html

...