可以在运行时更改 ejb 参数以进行@Schedule注释?

2022-09-02 21:24:18

对于有ejb经验的人来说,这可能是一个愚蠢的问题......

我想通过注释动态读取和更改使用 Java EE 调度程序的 EJB bean 之一的 minute 参数。有谁知道如何在运行时执行此操作,而不是在下面的类中对其进行硬编码?如果我以编程方式执行此操作,我还能使用注释吗?@Schedule@Schedule

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

答案 1

@Schedule用于容器在部署期间创建的自动计时器。

另一方面,您可以使用TimerService,它允许您在运行时定义何时调用该方法。@Timeout

这可能是您感兴趣的材料: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();
    }
}

再一次 - 就我个人而言,我永远不会使用这样的代码,也永远不会想在真正的项目中看到这样的东西:-)计时器之一是:

  • automatic,通过对值进行硬编码或在 ejb-jar 中定义它们来创建.xml,@Schedule
  • 编程,由应用程序代码创建,该应用程序代码在运行时中可以具有不同的值。

答案 2