Постоянство таймера JEE6 при повторном развертывании - PullRequest
2 голосов
/ 28 октября 2011

Одной из задач приложения, которое я разрабатываю, является резервное копирование данных других приложений, работающих в системе. Я хочу запланировать этот процесс резервного копирования так, чтобы он мог выполняться без присмотра. Я использую утилиты таймера JEE6 / EJB3.1.

У меня есть класс BackupConfiguration, который я сохраняю в базе данных, используя JPA2, которая имеет поле типа TimerHandle. Если пользователь решает запланировать резервное копирование, я создаю новый постоянный таймер и заполняю поле TimerHandle.

Если я перезагружаю сервер, все в порядке, таймеры перезагружаются (и возникает краткая паника, поскольку все таймеры срабатывают одновременно, вздыхают), и все так, как я оставил.

Если я повторно разверну приложение (что происходит довольно часто, пока я его разрабатываю), все таймеры будут потеряны! Я тупо предполагал, что таймеры будут привязаны к серверу, но оказывается, что они привязаны к приложению.

Итак, мой вопрос, каков наилучший способ сделать таймеры устойчивыми при повторном развертывании?

Единственное решение, которое я вижу, это сохранить ScheduleExpression, а также TimerHandle с резервной конфигурацией. Затем, если у меня есть ручка, но нет таймера, я воссоздаю таймер. Однако основная проблема заключается в том, что это означает перечисление каждого запланированного объекта каждый раз, когда приложение начинает выяснять, отсутствуют ли таймеры. Сейчас это не так много работы, но в будущем это может вылиться в огромные затраты.

Ответы [ 2 ]

2 голосов
/ 30 августа 2013

Для GlassFish есть опция --keepstate=true команды asadmin redeploy.
Он сохраняет таймеры EJB между перераспределениями.
Подробности вы можете увидеть:
http://docs.oracle.com/cd/E18930_01/html/821-2418/beahw.html
http://docs.oracle.com/cd/E18930_01/html/821-2416/ggndx.html#SJSASEEAGgkudf
http://docs.oracle.com/cd/E18930_01/html/821-2433/redeploy-1.html#scrolltoc

1 голос
/ 15 ноября 2011

Может показаться, что большинство (вероятно, все) серверы приложений поддерживают постоянные таймеры для приложения, а не для сервера. Это имеет смысл, поскольку при удалении приложения вы не хотите, чтобы таймеры зависали. Это неудобно во время разработки, потому что NetBeans, по крайней мере, удалит приложение перед повторным развертыванием, потеряв при этом все таймеры.

Решение, которое я придумала, заключается в сохранении TimerHandle и информации о расписании в базе данных. Когда приложение запускается, оно создает одноэлементный компонент TimerRepair, который вызывает repairTimers для любых классов, которым это требуется. Метод repairTimers выбирает все расписания и, если у них есть TimerHandle, пытается восстановить таймер. Если при восстановлении таймера возникает исключение, он воссоздает таймер из информации о расписании. В целом, это не так уж плохо, как решение, моя единственная реальная забота - чрезмерное время запуска, если запланировано много элементов.

...