Подтвердить что ты не робот

Можно изменить параметр ejb во время выполнения для аннотации @Schedule?

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

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

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

Ответ 1

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

С другой стороны, вы можете использовать TimerService, который позволяет определять во время выполнения, когда должен быть вызван метод @Timeout.

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

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

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

// Automatic timer - run every 5 seconds
// It 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 the first invocation, so it 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,
  • программный и создается кодом приложения, который может иметь разные значения во время выполнения.