gpt4 book ai didi

java - EJB @Schedule 等待方法完成

转载 作者:行者123 更新时间:2023-12-02 18:11:58 24 4
gpt4 key购买 nike

我想编写一个每分钟执行一次的后台作业(EJB 3.1)。为此,我使用以下注释:

@Schedule(minute = "*/1", hour = "*")

工作正常。

但是,有时该作业可能需要一分钟以上的时间。在这种情况下,计时器仍然会被触发,从而导致线程问题。

如果当前执行未完成,是否有可能终止调度程序?

最佳答案

如果只有 1 个计时器同时处于 Activity 状态,则有几种解决方案。

首先,@Timer 可能应该出现在 @Singleton 上。在单例中,方法默认是写锁定的,因此当容器中仍然有 Activity 时尝试调用计时器方法时,容器将自动被锁定。

以下内容基本上就足够了:

@Singleton
public class TimerBean {

@Schedule(second= "*/5", minute = "*", hour = "*", persistent = false)
public void atSchedule() throws InterruptedException {

System.out.println("Called");
Thread.sleep(10000);
}
}

atSchedule 默认情况下是写锁定的,并且其中只能有一个 Activity 线程,包括容器发起的调用。

一旦被锁定,容器可能会重试计时器,因此为了防止这种情况,您可以使用读锁并委托(delegate)给第二个 bean(需要第二个 bean,因为 EJB 3.1 不允许升级读锁)锁定为写锁定)。

计时器 bean:

@Singleton
public class TimerBean {

@EJB
private WorkerBean workerBean;

@Lock(READ)
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void atSchedule() {

try {
workerBean.doTimerWork();
} catch (Exception e) {
System.out.println("Timer still busy");
}
}

}

工作bean:

@Singleton
public class WorkerBean {

@AccessTimeout(0)
public void doTimerWork() throws InterruptedException {
System.out.println("Timer work started");
Thread.sleep(12000);
System.out.println("Timer work done");
}
}

这可能仍然会在日志中打印一个嘈杂的异常,因此更详细但更安静的解决方案是使用显式 boolean 值:

计时器 bean:

@Singleton
public class TimerBean {

@EJB
private WorkerBean workerBean;

@Lock(READ)
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void atSchedule() {
workerBean.doTimerWork();
}

}

工作bean:

@Singleton
public class WorkerBean {

private AtomicBoolean busy = new AtomicBoolean(false);

@Lock(READ)
public void doTimerWork() throws InterruptedException {

if (!busy.compareAndSet(false, true)) {
return;
}

try {
System.out.println("Timer work started");
Thread.sleep(12000);
System.out.println("Timer work done");
} finally {
busy.set(false);
}
}

}

还有一些可能的变化,例如您可以将忙碌检查委托(delegate)给拦截器,或者将仅包含 boolean 值的单例注入(inject)到计时器 bean 中,然后检查那里的 boolean 值,等等。

关于java - EJB @Schedule 等待方法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com