我正在开发一个在 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){ …Run Code Online (Sandbox Code Playgroud)