Служба таймера EJB: порядок тайм-аутов - PullRequest
0 голосов
/ 07 мая 2011

У меня определены два тайм-аута:
тайм-аут A - каждые 30 секунд
тайм-аут B - каждые 2 минуты

// scheduled for timeout A (every 30sec)
@Stateless
public class MyBeanA {
   (...)

   @Timeout
   public void onTimeoutA(javax.ejb.Timer timer) {
     // (...)
   }
}

// scheduled for timeout B (every 2min)
@Stateless
public class MyBeanB {
   (...)

   @Timeout
   public void onTimeoutB(javax.ejb.Timer timer) {
     // (...)
   }
}

Легко заметить, что через каждые 2 минуты оба тайм-аута будут срабатывать. Я хотел бы убедиться, что в этом случае тайм-аут A будет срабатывать до тайм-аута B:
(30 с): время ожидания A, (60 с): время ожидания A, (90 с): время ожидания A, (120 с): время ожидания A, время ожидания B

Возможно ли это со стандартным EJB (3.0) API службы таймера? Мой сервер приложений - JBoss.

Спасибо заранее, Петр

Ответы [ 2 ]

1 голос
/ 07 мая 2011

Нет встроенного способа заказа таймеров подобного типа. Вы можете сделать это вручную:

  1. Расписание таймера однократного действия для A на 30 секунд с информацией = 1
  2. Расписание интервального таймера для B на 120 секунд
  3. Когда A срабатывает с info = 1, назначьте таймер однократного действия для A на 30 секунд с info = 2
  4. Когда A срабатывает с info = 2, назначьте таймер одиночного действия для A на 30 секунд с info = 3
  5. Когда A срабатывает с info = 3, не перепланируйте
  6. Когда B срабатывает, позвоните A, затем выполните работу для B. Запланируйте таймер однократного действия для A на 30 секунд с информацией = 1
0 голосов
/ 15 мая 2011

Решение, которое я использовал, очень похоже на решение, данное bkail.Существует один метод ejbTimeout (), который должен запускаться каждые 30 секунд.Тайм-аут запланирован с Serializable объектом, содержащим счетчик:

createTimer(Date initialExpiration, long intervalDuration, Serializable info) 

Каждый раз, когда вызывается ejbTimeout, счетчик увеличивается.Если он достигнет 3, то вызывается метод, который должен быть запущен через 2 минуты, а также счетчик обнуляется. Он работает следующим образом:

ejbTimeout after 30sec (counter == 0): call A(); counter++;
ejbTimeout after 30sec (counter == 1): call A(); counter++;
ejbTimeout after 30sec (counter == 2): call A(); counter++;
ejbTimeout after 30sec (counter == 3): call A(); call B(); counter = 0;
...