Пример использования 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").
В следующий раз закончим тему таймеров, рассмотрев возможность параметризировать возникающее при достижении "часа Х" событие.
Комментариев нет:
Отправить комментарий