0

我有一个应用程序部署在带有 Java 1.7.1 的 WebSphere 8.5 上,定义了一个由 2 个节点组成的集群。在这个应用程序中有一个 EJB,它通过工作管理器提交一个异步作业。

问题是在 WAS 8.5 上,作业在集群的两个节点上执行了两次。在 WAS 6.1 中,这并没有发生。

工作由报警管理员提交。在提取的代码下方:

WorkManager wm = serviceLocator.getWorkManager("NameOfCustomWorkManager");            
AsynchScope scope = wm.findAsynchScope("scopeName");

if (scope == null) 
    scope = wm.createAsynchScope("scopeName");

AlarmManager alarmManager = scope.getAlarmManager();        

alarmManager.create(listener, "Alarm Context Info", (int) (DateUtils.getNextTime(nextTime) - System.currentTimeMillis()));  --Fired on a certain hours     

logger.info("Alarm fired.");

有人知道在 8.5 上是否有额外的配置来避免所描述的问题?

4

1 回答 1

0

WebSphere Application Server 中的 WorkManager,无论是哪个版本,都没有也从来没有跨远程 JVM 操作或协调的能力。WorkManager 的设计行为是它只能在您提交工作的同一 JVM 上运行您提交的工作,并且它不知道您从不同的 JVM 提交的重复工作,也没有机制跨 JVM 协调工作。您从 WorkManager 获得的 AlarmManager 实例也是如此。(WebSphere Application Server 其实有一种方法可以完成上面的事情,就是 Scheduler,但是上面的代码并没有使用那个)。是否有可能是应用程序中受版本更改影响的一些早期逻辑可能导致现在在两个成员上创建警报,

于 2018-04-24T13:39:13.247 回答