Как я могу использовать API службы таймера J2EE в коде запуска сервлета?
Вопрос
Для фонового задания, которое я хотел бы запустить в контейнере J2EE, я нашел предложение создать сервлет запуска и использовать API службы таймера для создания управляемого таймера (в ответах на Какие инструменты есть для синхронизированных пакетных процессов в J2EE? ). р>
Чтобы создать таймер, мне нужен контекст, который реализует API таймера. ( Пример )
В классе Servlet я переопределяю метод init, но у него есть доступ только к ServletContext, но не к SessionContext. ServletContext не имеет методов для создания таймеров, поэтому я застрял здесь.
Как я могу получить доступ к службе таймера J2EE в коде запуска сервлета?
Решение
Всякий раз, когда я слышу задание таймера, я не могу не думать, что его следует отделить от сервера приложений Java EE. Вы можете использовать что-то вроде Quartz, или запланированную задачу операционной системы, или менеджер пакетов, например AutoSys, но встраивание его в сервлет кажется мне неправильным использованием сервлетов.
Контейнеры Java EE 5 имеют службу TimerService, которая является EJB. Возможно, этот поможет вам разобраться. р>
Другие советы
Вместо использования кода запуска сервлета (который будет выполняться после каждого повторного развертывания) я обнаружил, что он более чист, чтобы запускать таймеры при запуске EJB. С EJB 3.1 и Singleton EJB это теперь возможно с гораздо меньшим количеством кода:
http://blogs.oracle.com/kensaks/entry/application_startup_shutdown_callbacks р>