单身人士与群集

时间:2016-07-08 13:28:08

标签: java oracle java-ee jboss singleton

我有一个这样的课程:

@Singleton
public class RecoveryWorker {
    @Schedule(minute = "*/1", hour = "*", persistent = false)
    public void run() {
        // heavy db queries ~ 2sec
        ...
    }
    ...
}

有2个wildfly实例有这个单例并且使用相同的oracle DB

有时候我有错误:

  

RROR [org.jboss.as.ejb3](EJB默认值 - 10)JBAS014120:调用计时器超时时出错:[id = 66ed65c4-3a2d-4343-870d-5f7a46a7742c timedObjectId = com.package.Worker auto-timer? :true persistent?:false timerService =org.jboss.as.ejb3.timerservice.TimerServiceImpl@222950e6 initialExpiration = null intervalDuration(in milli sec)= 0 nextExpiration = Wed Jun 15 00:01:00 CEST 2016 timerState = IN_TIMEOUT info = null :javax.ejb.ConcurrentAccessTimeoutException:JBAS014373:EJB 3.1 PFD2 4.8.5.5.1 org.jboss.invocation.InterceptorContext$Invocation@ead4bd3上的并发访问超时 - 无法在5000MILLISECONDS内获取锁定

我想知道这个块是如何发生的(Oracle有一个机制来阻止表或其他东西吗?)在一次实例中在几个实例中运行一个单例的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

@Singleton只是JVM的单例,不能保证它一次只在一个实例上运行。

JBAS014120是因为@Singleton合约,你的计时器是每分钟。在您的情况下,我认为有时“重型数据库查询”可以运行更长时间并且将启动另一个单例,因为您没有将锁定权限设置为READ,每次对单例的调用都将被合同阻止。

如果您需要群集范围的单身人士,您应该检查快速入门。 我编写了cluster-ha-singleton,它就是你的用例的例子。 https://github.com/wildfly/quickstart 它将选择一个节点并仅在其中一个集群节点上启动调度,如果节点崩溃,它将进行故障转移。

相关问题