繁体   English   中英

带集群的单例

[英]Singleton with cluster

我有这样的课:

@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自动计时器?:真持久?:false timerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@222950e6 initialExpiration = null intervalDuration(以毫秒为单位)= 0 nextExpiration = Wed Jun 15 00:01:00 CEST 2016 timerState = IN_TIMEOUT info = null:javax。 ejb.ConcurrentAccessTimeoutException:JBAS014373:org.jboss.invocation.InterceptorContext$Invocation@ead4bd3上的EJB 3.1 PFD2 4.8.5.5.1并发访问超时-无法在5000MILLISECONDS中获取锁定

我想知道这种阻塞是如何发生的(Oracle有机械化的功能来阻塞表或其他东西吗?)什么是一次在几个实例中运行一个单例的最佳实践?

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

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

如果需要群集范围内的单身人士,则应检查快速入门。 我已经编写了cluster-ha-singleton,它正是您的用例的示例。 https://github.com/wildfly/quickstart它将选择一个节点并仅在群集节点之一上启动计划,以防节点崩溃的情况下将进行故障转移。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM