Как я могу использовать API службы таймера J2EE в коде запуска сервлета?

StackOverflow https://stackoverflow.com/questions/1024081

Вопрос

Для фонового задания, которое я хотел бы запустить в контейнере 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top