Планирование задач, убедившись, что задача когда-либо выполняется - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть приложение, которое проверяет ресурс в Интернете на наличие новых писем.Если есть новые письма, они обрабатывают их.Это означает, что в зависимости от количества писем, это может занять несколько часов или часов обработки.

Теперь объект / программа, которая выполняет обработку, уже является одиночным.Так что сейчас я уже позаботился о том, чтобы на самом деле был только 1 экземпляр, который обрабатывает проверку и обработку.

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

Я понимаю, что могу позаботиться об этом с помощью Timer / Timertask или, что еще лучше, я нашел ресурс здесь: http://www.ibm.com/developerworks/java/library/j-schedule/index.html, который использует Scheduler / SchedulerTask.Но я боюсь, что если я настрою его запуск каждые 10 минут, а предыдущий сеанс уже обрабатывает данные, он поместит новую задачу в стек, ожидая выполнения после завершения предыдущей.Так что я боюсь, например, что первый запуск выполняется в течение 5 часов, а затем, потому что он был все время занят, после этого он запустит 5 * 6-1 = 29 запусков, которые выполняются сразу после друг друга, проверяя почту и /выполнить некоторую обработку без перерыва на сервере.

Кто-нибудь знает, как я могу решить эту проблему?

PS То, как я сейчас настраиваю свое приложение, это то, что я использую сервлет Java на своем сервере Tomcat, который запускается при запуске сервера, где он создает экземпляр Singleton моей основной программы, а затем вызывает некоторый метод дляделать выборку / обработку.И я хочу повторить эту выборку / обработку каждый «х» промежуток времени (10 минут или около того), убедившись, что действительно только 1 экземпляр делает это и что действительно после каждого запуска 10 минут или около того отдано отдыху.

1 Ответ

1 голос
/ 13 сентября 2011

На самом деле, Timer + TimerTask может справиться с этим довольно чисто. Если вы запланируете что-то с помощью Timer.scheduleAtFixedRate () Вы заметите, что в документах говорится, что он попытается «наверстать» поздние события, чтобы сохранить долгосрочный период выполнения. Однако это можно преодолеть с помощью TimerTask.scheduledExecutionTime () . Приведенный в нем пример позволяет выяснить, не слишком ли поздно выполнить задачу, и вы можете просто вернуться, вместо того чтобы что-либо делать. По сути, это «очистит очередь» от TimerTask.

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

Что касается примечания, вам не нужно обрабатывать все 10 тыс. Электронных писем в очереди за один прогон. Я бы предложил обработку в течение фиксированного промежутка времени с использованием TimerTask.scheduledExecutionTime (), чтобы выяснить, сколько у вас времени, а затем вернуться. Это делает ваш процесс более гибким, очищает стек между запусками и, если вы выполняете агрегаты, гарантирует, что вам не нужно перестраивать слишком много данных, если, например, сервер перезагружается в середине задачи. Но эта рекомендация основана на общих чертах, так как я не знаю, что вы делаете в задаче:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...