Java 将额外触发器添加到@Schedule

Java 将额外触发器添加到@Schedule,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我有一个具有以下计划方法的EJB: @Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) public void runWorkerManager() { final boolean jobProcessed = this.workerManager.execute(); if (jobProcessed) { this.runWorkerManager(); } }

我有一个具有以下计划方法的EJB:

@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
public void runWorkerManager() {
    final boolean jobProcessed = this.workerManager.execute();
    if (jobProcessed) {
        this.runWorkerManager();
    }
}
这个想法是,在处理一个作业之后,通常会有第二个和第三个等作业要处理,所以我想像上面一样再次运行execute方法

问题是这样做真的很糟糕,因为我没有释放EJB线程。相反,我想在@Schedule中添加一个额外的触发器,以便尽快再次运行整个runWorkerManager。然而,我还没有找到这样做的方法。
这可能吗?如果不是,是否有其他方法可以获得类似的行为?

对我来说,这个用例调用MessageDrivenBean


在您的情况下,我会使WorkerManager成为一个MessageDrivenBean,监听一些作业发送到的JMS队列。通过这种方式,您可以确保每当作业到达时,它都会被尽快处理。

我最后做的是首先获得对TimerService的引用,如下所示:

@Resource
TimerService timerService;
然后我在我的方法中添加了一个@Timeout注释,并使用该方法添加了一个新触发器:

@Schedule(hour = "*", minute = "*", second = "*/5", persistent = false)
@Timeout
public void runWorkerManager() {
    final boolean jobProcessed = this.workerManager.execute();
    if (jobProcessed) {
        timerService.createTimer(10L, "Check for more jobs...");
    }
}

这看起来像是对程序结构的一次彻底检修,这并不是我真正想做的事情。您已经在使用EJB,所以我认为这将是一个很大的麻烦。不管怎样,我不知道有什么方法可以只用无状态bean实现类似的功能。也许你可以试试控制反转,让你的作业存储通知工作人员一些工作已经准备好执行了吗?你是否考虑创建一个新线程?