HASingletonSupport.java |
/* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.ha.singleton; import java.util.List; import org.jboss.ha.jmx.HAServiceMBeanSupport; /** * Management Bean for an HA-Singleton service. * * @author <a href="mailto:ivelin@apache.org">Ivelin Ivanov</a> * Scott.Stark@jboss.org * @version $Revision: 1.4 $ */ public class HASingletonSupport extends HAServiceMBeanSupport implements HASingletonMBean, HASingleton { // Constants ----------------------------------------------------- private boolean isMasterNode = false; public HASingletonSupport() { // for JMX } /** * * @return true if this cluster node has the active mbean singleton. * false otherwise * * @jmx:managed-operation */ public boolean isMasterNode() { return isMasterNode; } // Protected ------------------------------ /** * <p> * Extending classes should override this method and implement the custom * singleton logic. Only one node in the cluster is the active master. * If the current node is elected for master, this method is invoked. * When another node is elected for master for some reason, the * stopSingleton() method is invokded. * </p> * * <p> * When the extending class is a stateful singleton, it will * usually use putDistributedState() and getDistributedState() to save in * the cluster environment information that will be needed by the next node * elected for master should the current master node * fail. * </p> * * @see HASingleton * */ public void startSingleton() { boolean debug = log.isDebugEnabled(); if (debug) log.debug("startSingleton() : elected for master singleton node"); // Extending classes will implement the singleton logic here } /** * Extending classes should override this method and implement the custom * singleton logic. Only one node in the cluster is the active master. * If the current node is master and another node is elected for master, this * method is invoked. * * @see HASingleton * */ public void stopSingleton() { boolean debug = log.isDebugEnabled(); if (debug) log.debug("stopSingleton() : another node in the partition (if any) is elected for master "); // Extending classes will implement the singleton logic here } /** * When topology changes, a new master is elected based on the result * of the isDRMMasterReplica() call. * * @see HAServiceMBeanSupport#partitionTopologyChanged(List, int) * @see DistributedReplicantManager#isMasterReplica(String); */ public void partitionTopologyChanged(List newReplicants, int newViewID) { boolean debug = log.isDebugEnabled(); boolean isElectedNewMaster = isDRMMasterReplica(); if( debug ) { log.debug("partitionTopologyChanged, isElectedNewMaster="+isElectedNewMaster +", isMasterNode="+isMasterNode+", viewID="+newViewID); } // if this node is already the master, don't bother electing it again if (isElectedNewMaster && isMasterNode) { return; } // just becoming master else if (isElectedNewMaster && !isMasterNode) { makeThisNodeMaster(); } // transition from master to slave else if( isMasterNode == true ) { _stopOldMaster(); } } protected void makeThisNodeMaster() { try { // stop the old master (if there is one) before starting the new one // ovidiu 09/02/04 - temporary solution for Case 1843, use an asynchronous // distributed call. //callMethodOnPartition("_stopOldMaster", new Object[0], new Class[0]); callAsyncMethodOnPartition("_stopOldMaster", new Object[0], new Class[0]); isMasterNode = true; // start new master startSingleton(); } catch (Exception ex) { log.error( "_stopOldMaster failed. New master singleton will not start.", ex); } } /** * This method will be invoked twice by the local node * when it stops as well as by the remote */ public void _stopOldMaster() { log.debug("_stopOldMaster, isMasterNode="+isMasterNode); // since this is a cluster call, all nodes will hear it // if the node is not the master, then ignore if (isMasterNode == true) { isMasterNode = false; stopSingleton(); } } // Private ------------------------------------------------------- // Inner classes ------------------------------------------------- }
HASingletonSupport.java |