不久前,我不得不更改Quartz Scheduler的标准集群行为,并使其能够在不同步数据库的情况下工作。 当然,有很多选择可以做到这一点,但是由于我是简单性的忠实拥护者,因此我决定使用标准的Spring @Scheduled配置,并且完全跳过了这一级的集群问题。 这个想法是在计划方法的开头只是调用“检查我是否在主节点上”方法。 唯一的问题是如何编写这种方法。 选择是使用JBoss HA Singleton功能。 它在JBoss 7.x中可用,但是缺少文档迫使进行了一些实验……太好了!
我们需要做的第一件事是提供适当的依赖关系,其中包含一些重要的类。 当然,请记住正确的版本(这里我使用的是7.1.1.Final,因为它在公共存储库中可用,并且所有下一个版本的7都需要手动构建)。
<dependency><groupid>org.jboss.as</groupid><artifactid>jboss-as-clustering-singleton</artifactid><version>7.1.1.Final</version><scope>provided</scope>
</dependency>
现在是时候进行一些编码了! 让我们从包含将要安装到应用程序服务器中的服务的类开始。 它的作用是设置主状态标志,并通过简单的静态方法将其公开。
import org.jboss.msc.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicBoolean;public class MasterStatusHaSingleton extends AbstractService<Serializable> {private static final Logger LOGGER = LoggerFactory.getLogger(MasterStatusHaSingleton.class);private static AtomicBoolean masterStatus = new AtomicBoolean(false);@Overridepublic void start(StartContext startContext) {LOGGER.info("MasterStatusHaSingleton started");masterStatus.set(true);}@Overridepublic void stop(StopContext stopContext) {LOGGER.info("MasterStatusHaSingleton stopped");masterStatus.set(false);}public static boolean isMaster() {return masterStatus.get();}
}
现在我们需要编写将准备好的服务安装到容器中的类。
package com.stackholder.jboss.ha;import org.jboss.as.clustering.singleton.SingletonService;
import org.jboss.msc.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HaSingletonActivator implements ServiceActivator {private final static Logger LOGGER =LoggerFactory.getLogger(HaSingletonActivator.class);public static final ServiceName SINGLETON_SERVICE_NAME =ServiceName.JBOSS.append("ha", "singleton");@Overridepublic void activate(ServiceActivatorContext context) throws ServiceRegistryException {LOGGER.info("HaSingletonActivator will be installed");MasterStatusHaSingleton srv = new MasterStatusHaSingleton();SingletonService singleton = new SingletonService(srv, SINGLETON_SERVICE_NAME);singleton.build(new DelegatingServiceContainer(context.getServiceTarget(),context.getServiceRegistry())).setInitialMode(ServiceController.Mode.ACTIVE).install();LOGGER.info("HaSingletonActivator installation SUCCESSFUL");}
}
请记住,JBoss 7使用的是OSGi,因此我们必须告诉应用程序服务器我们将在应用程序中使用哪些模块。 最简单的方法是将配置添加到war或jar插件中:
<configuration><archive><manifestentries><dependencies>org.jboss.msc,org.jboss.as.server,org.jboss.as.clustering.singleton</dependencies></manifestentries></archive>
</configuration>
太好了-快完成了! 几乎。 我们要做的最后一件事是在JBoss配置中激活适当的模块。 只需编辑standalone-full-ha.xml文件(或您当然使用的其他配置),然后将以下模块添加到ee子系统中:
<subsystem xmlns="urn:jboss:domain:ee:1.0"><global-modules><module name="org.jboss.msc" slot="main"><module name="org.jboss.as.clustering.singleton" slot="main"></global-modules>
</subsystem>
最后,您可以执行服务器并享受新的酷功能。
翻译自: https://www.javacodegeeks.com/2013/09/using-ha-singleton-in-jboss-7.html