Jboss AS 6.0.0-Final - HASingleton Service Restart fail on cluster merge
jojopotatoe Jun 29, 2011 2:15 AMHi,
we are using JBoss 6.0.0-Final version.
We deployed a HASingleton Service as described in this document : http://community.jboss.org/wiki/WritingAClusteredHASingletonService
All goes fine in singleton start/stop for the case : server shutdown.
But when with this test case :
- server 1 master and server 2 slave
- we cut network on server 1
- server 2 is now master and server 1 is still master too
- we reconnect server 1
- we saw ClusterMerges messages (refresh view ... bridge connection ...)
- but the two HASingleton are started and none of them went into the restart procedure http://community.jboss.org/wiki/HASingletonAndClusterMerges
(start and stop invoke)
I can observe this on my beans but also on yours : if you look at HASingletonDeployer service in JMX Console it seems that MasterNode attribute is set to True on each cluster instance after my test case.
Is this a problem in my code or the normal HAController implmentation ?
Will Service and HA fonction support continue on next version ? (7.0.0)
Here is my code :
IHATest.java
@Remote
@RemoteBinding(jndiBinding = HATest.JNDI_NAME)
public interface IHATest
{
    public void create () throws Exception;
    public void destroy () throws Exception;
    public void start () throws Exception;
    public void stop () throws Exception;
    boolean isMasterNode();
    void startSingleton() throws NamingException;
    void stopSingleton() throws NamingException;
}
HATest.java
@Service(objectName = HATest.OBJECT_NAME)
@Management(IHATest.class)
public class HATest implements IHATest
{
    /** Variable de journalisation. */
    private static Logger log = LoggerFactory.getLogger(HATest.class);
    /** NOM JNDI. */
    public static final String JNDI_NAME = "myn/HATest/remote";
    /** Nom JNDI de l'EJB (pour les invocations de type lookup jndi). */
    public static final String OBJECT_NAME = "myn:service=HATest";
    /** Indique si le singleton est démaré en tant que MASTER. */
    public boolean masterNode = false;
    /** Reference interne. */
    private IHATest reference;
    // MANAGEMENT
    public void start() throws NamingException
    {
         log.info("MANAGEMENT START HATest");
         // Remove from local JNDI until started as a singleton,
         // but keep the reference locally so it could be restored later.
         Context ctx = new InitialContext();
         reference = (IHATest) ctx.lookup(JNDI_NAME);
         Util.unbind(ctx, JNDI_NAME);
    }
    public void stop()
    {
        log.info("MANAGEMENT STOP HATest");
    }
    public void startSingleton() throws NamingException
    {
         log.info("SINGLETON STARTED !!!");
         masterNode = true;        
         /*
         * Rebind to JNDI when started as singleton
         */
         Context ctx = new InitialContext();
         Util.rebind(ctx, JNDI_NAME, reference);
    }
    public void stopSingleton() throws NamingException
    {
         log.info("SINGLETON STOPPED !!!");
         masterNode = false;
         /*
         * Unbind from local JNDI when stopped
         */
         Context ctx = new InitialContext();
         Util.unbind(ctx, JNDI_NAME);
    }
    /*
     * (non-Javadoc)
     * 
     * @see fr.dcns.ha.IMan#create()
     */
    @Override
    public void create() throws Exception
    {
        // TODO Auto-generated method stub
    }
    /*
     * (non-Javadoc)
     * 
     * @see fr.dcns.ha.IMan#destroy()
     */
    @Override
    public void destroy() throws Exception
    {
        // TODO Auto-generated method stub
    }
    /*
     * (non-Javadoc)
     * 
     * @see fr.dcns.ha.IMan#isStarted()
     */
    public boolean isMasterNode()
    {
        return masterNode;
    } 
jboss-service.xml
<server> <mbean name="myn:service=HATest-Controller" code="org.jboss.ha.singleton.HASingletonController"> <depends>myn:service=HATest</depends> <depends>HASingletonDeployerBarrierController</depends> <attribute name="HAPartition"><inject bean="HAPartition" /></attribute> <attribute name="TargetName">myn:service=HATest</attribute> <attribute name="TargetStartMethod">startSingleton</attribute> <attribute name="TargetStopMethod">stopSingleton</attribute> <attribute name="RestartOnMerge">true</attribute> </mbean> </server>
 
    