Управление планировщиком Cron4J в среде J2EE
Моя команда создала веб-приложение, которое мы надеемся связать с планировщиком задач, который будет отправлять электронные письма один раз в день, если какой-либо из проектов, выполняемых через веб-приложение, выполняется с задержкой.
Библиотека планировщика, которую мы используем, Cron4j, достаточно проста, и в настоящее время мы пытаемся управлять ею с помощью набора вызовов веб-служб, что-то вроде этого (идея заключается в том, что мы запускаем планировщик, и он работает для указанное время или пока мы его не остановим):
public SchedulerResource(){
s = new Scheduler();
}
@GET
@Path("start")
@Produces(MediaType.APPLICATION_JSON)
public Response invoke_workback_communicator() throws MalformedURLException {
s.schedule("* * * * *", new Runnable() {
public void run() {
WorkbackCommunicator communicator = new WorkbackCommunicator();
communicator.run();
}
});
s.start();
try {
Thread.sleep(1000L * 60L * 2L);
} catch (InterruptedException e) {
;
}
s.stop();
return Response.noContent().build();
}
@GET
@Path("stop")
@Produces(MediaType.APPLICATION_JSON)
public Response stop_workback_communicator() throws MalformedURLException {
s.stop();
return Response.noContent().build();
}
В настоящее время метод invoke_workback работает нормально, метод stop_workback не работает.
Что мне интересно, так это:
- это вызывает планировщик в веб-сервисе, как эта плохая практика?
- если да, то как эффективно реализовать эту функцию?
- если нет, то как я могу создать интерфейс службы, который управляет моим экземпляром планировщика? Это даже необходимо?
РЕДАКТИРОВАТЬ:
Посмотрев дальше, я заметил, что существует нечто, называемое ServletContextListener, которое можно использовать для запуска или уничтожения планировщика при запуске и завершении работы сервера. Итак, на данный момент я думаю о том, чтобы протестировать эту функциональность и сохранить наш сервис, который позволит нам управлять планировщиком, когда приложение еще работает.
1 ответ
Я все еще интересуюсь некоторыми внешними взглядами на эту тему, однако мы нашли решение, которое выглядит так, что оно будет работать достаточно хорошо. То, что мы сделали, это реализовали ServletContextListener, который запускает наш планировщик при запуске контекста, когда сервер запускается, и останавливает планировщик при уничтожении контекста, когда сервер останавливается.
Нам просто нужно было добавить прослушиватель в виде записи в нашем файле web.xml в папке WEB-INF нашего проекта:
<listener>
<listener-class>com.mmm.marketing.utils.SchedulerServletContextListener</listener-class>
</listener>
Мы также написали веб-сервис, который позволит нам останавливать и запускать планировщик синглтона вручную, если мы захотим.