【发布时间】:2018-03-21 20:47:28
【问题描述】:
我正在开发一个在 IBM WebSphere Application Server 上的集群 Java EE 环境中运行的应用程序。我们有一个启动单例 bean,它创建一个持久的 EJB 计时器,并且我们配置了 EJB 计时器服务,以便每个集群节点使用相同的数据库表。如何确保 2 个节点不会在启动时都创建持久计时器?我知道如何确保只有一个节点真正运行超时方法,但不知道如何确保计时器不会被创建两次。
我们目前在启动时取消并重新创建具有相同“名称”的所有计时器,这意味着(如果我理解正确的话),只要集群节点不同时初始化这个 bean,那么最后一个启动的节点将清除任何现有计时器并重新创建单个计时器实例。但是,如何确保避免出现 2 个节点同时退出 cancelTimer() 方法并同时运行 TimerService.createTimer() 方法的罕见情况,为集群创建 2 个相同的计时器?
下面是一些示例代码:
@Startup
@Singleton
public class Timer{
String timerName = "myTimer";
@Resource
private SessionContext sessionCtx;
@PostConstruct
public void start() {
cancelTimer();
TimerService ts = sessionCtx.getTimerService();
ts.createTimer(new Date(), 60000, timerName);
}
@PreDestroy
public void stop() {
cancelTimer();
}
public void cancelTimer() {
TimerService ts = sessionCtx.getTimerService();
Collection<Timer> timers = ts.getTimers();
for(Timer timer : timers){
if (timer.getInfo().equals(timerName)) {
timer.cancel();
}
}
}
@Timeout
public void timeout() {
System.out.println("timeout!");
}
}
【问题讨论】:
-
@john 这是相关信息,我之前阅读了该页面,但不幸的是它没有我需要的信息。
标签: jakarta-ee ejb websphere