关于集群环境中的自动(使用 @Schedule )持久性和非持久性计时器,文档指出持久性计时器仅在一个集群成员中运行,并且自动非持久性计时器运行在包含EJB的每个集群成员中:
群集环境中的计时器
在集群环境中,持久计时器仅在一个计算机中运行 集群成员,可能不一定是同一个集群成员 它是在。每个集群成员中运行的非持久性计时器 它是在 - 每个中运行的自动非持久性计时器中创建的 包含EJB的集群成员。
我想使用Persistent计时器的这个功能(只在一个集群成员上运行计时器),但我不想要“持久”功能,它指定计时器将在服务器重启或崩溃后继续运行尝试“赶上”无法触发的计时器事件。
有没有办法让一个只在一个集群成员上运行的自动非持久性计时器?或者,是否可以关闭持久定时器的“追赶”功能?
答案 0 :(得分:0)
您要求的功能(非持久性计时器仅在一个集群成员上运行而没有“赶上”以前错过的到期)并未内置到WebSphere Application Server中。但是,有几种方法可以模拟它。
第一个选项:安排一个持久的EJB间隔计时器,该计时器调用javax.ejb.Timer.getTimeRemaining并在否定时跳过自身。
第二个选项:在每个成员上安排非持久性计时器。使用数据库或其他持久性存储来记录最近尝试执行的时间戳。当非持久性计时器尝试运行时,尝试更新持久性存储以将时间戳替换为当前时间戳(如果它最近未运行)。如果成功,则运行计时器,否则不运行。如果集群成员相对较少,这可能会很好,否则数据库上可能存在太多争用。