在JBoss 7中使用HA Singleton
不久前,我不得不更改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>現在是時候進行一些編碼了! 讓我們從包含將要安裝到應用程序服務器中的服務的類開始。 它的作用是設置主狀態標志,并通過簡單的靜態方法將其公開。
包com.stackholder.jboss.ha;
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
總結
以上是生活随笔為你收集整理的在JBoss 7中使用HA Singleton的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 事业单位备案制和事业编制有什么区别(事业
- 下一篇: 受JAAS保护的JAX-RS端点