Как сделать EJB Timer устойчивым к false - PullRequest
1 голос
/ 24 января 2012

Я использую EJB 3.0 Timers в своем приложении.

Одна из особенностей таймеров EJB заключается в том, что они по умолчанию являются постоянными, что означает, что при перезапуске сервера таймеры будут автоматически вызываться без повторного вызова.

У меня есть требование, чтобы эти таймеры запускались вручную при каждом перезапуске сервера .Для этого я знаю, что нам нужно изменить некоторый атрибут в конфигурационном XML, который я не знаю точно.

Где мне нужно изменить атрибут, чтобы установить persistent = false .

Я использую Weblogic Server.

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

Эта ветка старая, но я думаю, что проблемы все еще актуальны в наши дни.Начиная с EJB 3.1 существует атрибут, задающий постоянство EJB, как указано @ mikko-maunu , но я чувствовал, что он был смоделирован с двумя обязанностями:

  • , чтобы иметь расписаниеконфигурация сохраняется после повторной инициализации системы;
  • для подтверждения всех, в конечном итоге, сбоев при запуске системы при инициализации.

Я думаю, что описанные выше концепции должны были быть смоделированы независимо, поэтому мы могли бы сохранить таймер EJBв базе данных, а также более точно контролируют, что делать с ошибочно сработавшими триггерами при повторной инициализации системы, т. е. в случае их повторного запуска или игнорирования.

В противном случае может показаться неудобным наличие модуля задания на основе таймера EJB, где некоторые изони хранятся в БД, а другие нет, просто потому, что мы не хотим обновлять ранее пропущенные триггеры для задания, запланированного слишком часто, например, ежечасно.

Я заметил,в JBoss 7.1 / Java EE 7 хранение информации о расписании в базе данных можетпредварительно поддерживает централизованное управление кластерной конфигурацией вместо повторяющихся и независимых экземпляров непостоянных временных графиков.Но коллатеральный эффект заключается в том, что для задания, запускаемого много раз в день, все равномерно пропущенные триггеры запускаются сразу при повторной инициализации системы.


Чтобы получить более точный контроль над постоянным таймером EJB при перезапуске, мымог бы при методе @ PostConstruct проверить, не истек ли таймер getNextTimeout().Если таймер должен игнорировать пропущенные по времени триггеры, мы можем отменить старый таймер и немедленно создать новый, используя то же расписание scheduleExpression, поэтому будут рассматриваться только будущие триггеры.Это кажется очень полезным для таймеров, запланированных для запуска много раз в день.


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

0 голосов
/ 19 марта 2019
  • Создайте программный таймер (необходим метод @Timeout)

    TimerConfig timerConfig = new TimerConfig("some info ...", false); timerService.createIntervalTimer(3000, 1000, timerConfig);

  • или создайте автоматический таймер: просто аннотируйте метод с помощью@Schedule:

    @Schedule(hour = "*", minute = "*", second = "*", persistent = false) private void myScheduledMethod(Timer timer) { // ... }

Чтобы это работало, вам нужно использовать EJB 3.1 или выше, что означает, что вам нужен Java EE 6 (или выше)Сервер или контейнер, поддерживающий эту версию ejb.Для использования Weblogic нужна как минимум версия 12cR1 .

  • Если это не помогло, я бы предложил отменить все таймеры при выключении, т. Е. В методе @PreDestroy соответствующего компонента.

Надеюсь, яможет помочь.

0 голосов
/ 07 февраля 2012

В EJB 3.0 таймеры являются постоянными, и нет атрибута, который можно установить, чтобы сделать их непостоянными.Возможность повлиять на это появилась с EJB 3.1 TimerConfig .Также специфичная для WebLogic конфигурация не предоставляет никакой помощи.

...