Рассматриваемые темы EJB Timer сервис Создание таймера Отмена и сохранение таймера Получение информации о таймере Транзакции и таймеры 11-1 EJB Timer сервис Использование таймеров в EJB Таймеры используются для запуска определенного обработчика по определенному во времени событию Таймеры могут срабатывать: В конкретно определенное время (10:00 01 января 2010 года) По прошествии определенного времени (через 30 минут) Через определенные интервалы 11-2 времени (каждые 12 часов) EJB Timer сервис Метод Timeout При срабатывании таймера контейнер вызывает метод с аннотацией @Timeout Метод должен: Возвращать void; Принимать параметр типа Timer Не иметь каких-либо исключений: @Timeout public void timeout(Timer timer) { System.out.println("Timeout!"); } 11-3 Рассматриваемые темы EJB Timer сервис Создание таймера Работа с таймерами Транзакции и таймеры 11-4 Создание таймера Интерфейс TimerService Для создания таймера используются методы интерфейса TimerService Экземпляр интерфейса TimerService получают с помощью Dependency Injection: @Resource TimerService timerService; 11-5 Создание таймера Методы для создания таймера Для создания таймера используются методы createTimer интерфейса TimerService createTimer(long, createTimer(long, createTimer(Date, createTimer(Date, Serializable) long, Serializable) Serializable) long, Serializable) Timer t = timerService. createTimer(1000L, "Timer"); 11-6 Создание таймера Таймеры устойчивы Если сервер завершает работу (или падает), таймеры сохраняются и вновь активируются после поднятия сервера Если таймаут истекает в то время, как сервер выключен, таймер сработает при запуске сервера Хотя при создании таймера время указывается в миллисекундах, такая точность не гарантируется контейнером 11-7 Рассматриваемые темы EJB Timer сервис Создание таймера Работа с таймерами Транзакции и таймеры 11-8 Работа с таймерами Отмена таймеров Таймеры могут быть отменены: В случае одноразового таймера, контейнер отменяет таймер сразу после вызова метода Timeout В случае вызова метода cancel интерфейса Timer В случае вызова этого метода на уже отмененном таймере, выбрасывается исключение javax.ejb.NoSuchObjectLocalException 11-9 Работа с таймерами Сохранение таймеров Таймер может быть сохранен Для этого получают объект TimerHandle с помощью метода Timer.getHandle Этот объект может быть сохранен в БД Для восстановления таймера используется TimerHandle.getTimer Объект TimerHandle не может быть использован удаленными компонентами 11-10 Работа с таймерами Получение информации о таймере Следующие методы интерфейса Timer используются для получения информации о таймере: long getTimeRemaining() Date getNextTimeout() Serializable getInfo() Для получения информации обо всех активных таймерах в bean'е, используется TimerService.getTimers() 11-11 Рассматриваемые темы EJB Timer сервис Создание таймера Работа с таймерами Транзакции и таймеры 11-12 Транзакции и таймеры Использование транзакций Обычно создание таймера производится в контексте транзакции Если транзакция откатывается, создание таймера также отменяется Аналогично при отмене таймера внутри транзакции при откате последней отмена таймера так же откатывается В этом случае время таймера сбрасывается как если бы отмены 11-13 таймера не происходило Транзакции и таймеры Контейнерные транзакции В случае контейнерных (containermanaged) транзакций метод с аннотацией Timeout по умолчанию имеет атрибут транзакции Required или RequiresNew Это необходимо для обеспечения целостности данных В этом случае контейнер создает новую транзакцию перед вызовом метода Timeout 11-14 Рассмотренные темы EJB Timer сервис Создание таймера Работа с таймерами Транзакции и таймеры 11-15 Практика Упражнение Использование таймера в EJB-приложении. 11-16