Можно ли изменить параметр ejb во время выполнения для аннотации @Schedule? - PullRequest
17 голосов
/ 30 ноября 2011

Наверное, глупый вопрос для кого-то с опытом ejb ...

Я хочу динамически считывать и изменять параметр минуты для одного из моих EJB-компонентов, использующего планировщик Java EE с помощью аннотации @Schedule. Кто-нибудь знает, как сделать это во время выполнения, в отличие от жесткого кодирования в классе, как показано ниже? Если бы я делал это программно, смог бы я использовать аннотацию @Schedule?

 @Schedule(dayOfWeek = "0-5", hour = "0/2", minute = "0/20", timezone = "America/Los_Angeles")
 private void checkInventory() {
 }

1 Ответ

23 голосов
/ 30 ноября 2011

@Schedule для автоматических таймеров, созданных контейнером во время развертывания.

С другой стороны, вы можете использовать TimerService, что позволяет вам определять во время выполнения, когда *Необходимо вызвать метод 1007 *.

Это может быть интересным материалом для: Учебное пособие по Java EE 6 - Использование службы таймера .

РЕДАКТИРОВАТЬ: Просто чтобы сделать этот ответ более полным.Если это вопрос возможно ли , то ответ будет - да, это так.

Существует способ «изменить параметры» автоматического таймерасоздан с @Schedule.Тем не менее это довольно необыкновенно - оно отменяет автоматический таймер и создает аналогичный программный таймер:

// Automatic timer - run every 5 seconds
// It's a automatic (@Schedule) and programmatic (@Timeout) timer timeout method
// at the same time (which is UNUSUAL)
@Schedule(hour = "*", minute = "*", second = "*/5")
@Timeout
public void myScheduler(Timer timer) {

    // This might be checked basing on i.e. timer.getInfo().
    firstSchedule = ...

    if (!firstSchedule) {
        // ordinary code for the scheduler
    } else {

        // Get actual schedule expression.
        // It's the first invocation, so it's equal to the one in @Schedule(...)
        ScheduleExpression expr = timer.getSchedule();

        // Your new expression from now on
        expr.second("*/7");

        // timers is TimerService object injected using @Resource TimerService.

        // Create new timer based on modified expression.
        timers.createCalendarTimer(expr);

        // Cancel the timer created with @Schedule annotation.
        timer.cancel();
    }
}

Еще раз - лично я никогда не использовал бы такой код и никогда не хотел бы видеть что-либокак в реальном проекте :-) Либо таймер:

  • автоматический и создается с помощью @Schedule путем жесткого кодирования значений или определения их в ejb-jar.xml,
  • программно и создается кодом приложения, который может иметь различные значения во время выполнения.
...