суббота, 12 марта 2011 г.

EJB: используем TimerService. Часть 1

Пример использования Singleton

В прошлой заметке был показан механизм создания Singleton, используя возможности EJB 3.1. Однако созданный сервис не выполнял никакой полезной работы, поэтому смысл действа казался несколько туманным.

Создадим с помощью Singleton некоторую задачу, которая требует постоянного выполнения, независимо от действией пользователей системы. Например, требуется написать некоторый оповещатель пользователя о том, что пришла новая почта. В этом случае нам потребуется механизм, способный запускать функцию проверки почтового ящика, например, каждую минуту.


Как это сделать?
Открываем заготовку Singleton из прошлой заметки и наполняем её содержанием:


  • Необходим специальный интерфейс TimerService, позволяющий создавать различные виды таймеров.
    @Resource
    private TimerService timerService;

  • В метод инициализации, выполняемый сразу после инстанцирования объекта добавляем задание. Этим мы добьёмся того, что каждые 60 секунд будет срабатывать таймер и пытаться вызвать метод, помеченный аннотаций @Timeout.
    @PostConstruct
    public void init() {
    System.out.println("Инициализируем проверку почты");

    long interval = 60000L; // 1 minute
    timerService.createIntervalTimer(0L,
    interval, new TimerConfig(null, false));
    }

  • Наконец, нужно описать само действие, которое должно выполняться раз в минуту:
    @Timeout
    public void process(Timer timer) {
    checkMail();
    }


Собственно, это весь код, необходимый для организации событий, которые бы срабатывали с определённой частотой. Можно лишь добавить, что TimerService предоставляет несколько разных видов таймеров. В этом примере использовался createIntervalTimer, когда события возникают всегда через одинаковый интервал времени. Помимо этого доступны одноразовые таймеры (сработает единожды через определённое количество секунд, или же в определённое время), таймеры на основе CRON (с возможностью задать временное условие вида "каждый будний день в 9:00").


В следующий раз закончим тему таймеров, рассмотрев возможность параметризировать возникающее при достижении "часа Х" событие.

Комментариев нет:

Отправить комментарий