Подтвердить что ты не робот

Spring Планировщик неожиданно останавливается

У нас есть веб-приложение Spring 3 на Tomcat 6, которое использует несколько плановых сервисов через @Scheduled (в основном для заданий, которые запускаются каждую ночь). Теперь кажется, что иногда (редко, возможно, раз в два месяца или около того) поток планировщика перестает работать, поэтому ни одно из заданий не будет выполнено в следующую ночь. В наших файлах журналов нет исключений или регистрации.

Кто-нибудь подсказывает, почему это происходит? Или как получить дополнительную информацию об этой проблеме?

Есть ли способ обнаружить эту ситуацию в приложении и перезапустить планировщик?

В настоящее время мы решаем это, имея также задание на ведение журнала, которое выполняется каждые 5 минут и создает запись в журнале. Если файл журнала перестает обновляться (контролируется nagios), мы знаем, что пришло время перезагрузить tomcat. Было бы неплохо перезапустить задания без полного перезапуска сервера.

4b9b3361

Ответ 1

Поскольку этот вопрос получил так много голосов, я опубликую, какое решение (вероятно, очень конкретное) для моей проблемы было.

Мы используем библиотеку Apache HttpClient для совершения вызовов удаленных служб в запланированных заданиях. К сожалению, при выполнении запросов нет тайм-аутов по умолчанию. После установки

connectTimeout
connectionRequestTimeout
socketTimeout

до 30 секунд проблема исчезла.

int timeout = 30 * 1000; // 30 seconds
RequestConfig requestConfig = RequestConfig.custom()
        .setConnectTimeout(timeout)
        .setConnectionRequestTimeout(timeout)
        .setSocketTimeout(timeout).build();
HttpClient client = HttpClients.custom()
        .setDefaultRequestConfig(requestConfig).build();

Ответ 2

Это довольно легко узнать. Вы будете делать это со стеком. Есть много сообщений о том, как получить трассировку стека, в системе unix, которую вы делаете "kill -3", и трассировка стека появляется в файле журнала catalina.out.

Как только у вас есть трассировка стека, найдите поток планировщика и посмотрите, что он делает. Возможно ли, что выполняемая им задача застряла?

вы также можете отправить трассировку стека здесь для получения дополнительной справки.

важно знать, какой планировщик вы используете. если вы используете SimpleAsyncTaskExecutor, он запустит новый поток для каждой задачи, и ваше планирование никогда не завершится. Однако, если у вас есть задачи, которые не закончены, в конечном итоге у вас закончится нехватка памяти.

http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html