I am currently trying the approach to Singleton MBeans for clustering suggested in the 
JBoss Clustering article by Ivelin Ivanov at 
http://www.onjava.com/pub/a/onjava/2003/08/20/jboss_clustering.html, however there is 
not enough information in the article -- and I am still working on this approach.  I 
have modified a singleton class to be a singleton MBean as described but as yet I am 
having trouble with the JBoss not being able to start the service, with complaints of 
a nested throwable and an  method not being available in the singleton class:


  | 12:38:51,141 ERROR [URLDeploymentScanner] Incomplete Deployment listing:
  | Incompletely deployed packages:
  | [EMAIL PROTECTED] { 
url=file:/C:/jboss-3.2.5/server/all/farm/cluster-examples-service.xml }
  |   deployer: [EMAIL PROTECTED]
  |   status: Deployment FAILED reason: create operation failed for package 
file:/C:/jboss-3.2.5/server/all/farm/cluster-examples-service.xml; - nested throwable: 
(org.jboss.deployment.DeploymentException: 
com.harborsideplus.grover.mbean.AllUserMessagesSingleton.<init>(); - nested throwable: 
(java.lang.NoSuchMethodException: 
com.harborsideplus.grover.mbean.AllUserMessagesSingleton.<init>()))
  |   state: FAILED
  |   watch: file:/C:/jboss-3.2.5/server/all/farm/cluster-examples-service.xml 
  | 


I have modified the singleton to be a MBean as described in the article, the MBean and 
interfaces are listed below:



  | // ----------  All UserMessagesSingletonMBean interface ----------------
  | package com.harborsideplus.grover.mbean;
  | 
  | import com.harborsideplus.grover.util.UserMessages;
  | 
  | /**
  |  * @author James Adams
  |  *
  |  */
  | public interface AllUserMessagesSingletonMBean
  | {
  |     
//================================================================================
  |     // managed MBean operations, which control the lifecycle of the singleton 
service
  |     
//================================================================================
  |     public void startSingleton ();
  |     public void stopSingleton ();
  | 
  |     
  |     
//================================================================================
  |     // exposed methods
  |     
//================================================================================
  |     
  |     /**
  |      * 
  |      * @return
  |      */
  |     public boolean isMasterNode ();
  | 
  |     
  |     /**
  |      * Get the user's messages beginning at the specified index.
  |      * 
  |      * @param userId
  |      * @param index
  |      * @return
  |      */
  |     public UserMessages getUserMessages (String userId,
  |                                          int index);
  | 
  | 
  |     /**
  |     * Add a message for the specified user.  If the specified user doesn't already
  |     * have a UserMessages list then one will be initialized before adding the 
message.
  |     * 
  |     * @param userId
  |     * @param message
  |     */
  |     public void addMessage (String userId,
  |                             String message);
  | 
  | 
  |     /**
  |     * Get the number of messages for the specified user.
  |     * @param userId
  |     * @return
  |     */
  |     public int getNumberOfUserMessages (String userId);
  | 
  | }
  | 
  | 
  | 
  | //----------- AllUserMessagesSingleton class ---------------------
  | 
  | package com.harborsideplus.grover.mbean;
  | 
  | import java.util.ArrayList;
  | import java.util.Enumeration;
  | import java.util.Hashtable;
  | 
  | import com.harborsideplus.grover.util.UserMessages;
  | 
  | /**
  |  * @author James Adams
  |  *
  |  */
  | public class AllUserMessagesSingleton
  |     implements AllUserMessagesSingletonMBean
  | {    
  |     // reference to the singleton
  |     private static AllUserMessagesSingleton m_reference;
  |     
  |     // hashtable of UserMessages
  |     private Hashtable m_userMessagesTable;
  |     
  |     // flag showing whether or not running on master node
  |     private boolean m_isMasterNode;
  |     
  | 
  |     
//================================================================================
  |     // managed MBean operations, which control the lifecycle of the singleton 
service
  |     
//================================================================================   
  |     
  |     /**
  |      * 
  |      */
  |     public void startSingleton ()
  |     {
  |         m_isMasterNode = true;
  |     }
  | 
  |     /**
  |      * 
  |      */
  |     public void stopSingleton ()
  |     {
  |         m_isMasterNode = false;
  |     }
  |     
  | 
  |     //=============================================================
  |     // Singleton-related methods
  |     //=============================================================
  |     
  |     /**
  |      * Constructor method which is private to insure that the class can't be 
instantiated.
  |      * A reference to an object of the class must be obtained via the 
getIOIMessagesBean() method.
  |      * 
  |      */
  |     private AllUserMessagesSingleton ()
  |     {
  |         // initialize the ArrayList
  |         m_userMessagesTable = new Hashtable();
  |     }
  |     
  |     
  |     /**
  |      * Method used to obtain a reference to the object.
  |      * 
  |      * @return reference to the singleton object
  |      */
  |     public static synchronized AllUserMessagesSingleton getReference ()
  |     {
  |         // if the reference hasn't already been created then instantiate an object
  |         if (m_reference == null)
  |         {
  |             // call the constructor
  |             m_reference = new AllUserMessagesSingleton();
  |         }
  |         
  |         // return our reference
  |         return m_reference;
  |     }
  |     
  |     
  |     /**
  |      * Method provided in order to prevent cloning of the object.  The method 
always throws an
  |      * exception to indicate that cloning is not supported by this class.
  |      * 
  |      * @return never returns anything
  |      * @throws CloneNotSupportedException to inicate that cloning is not supported 
by this class
  |      */
  |     public Object clone ()
  |         throws CloneNotSupportedException
  |     {
  |         // do not allow cloning - throw an exception
  |         throw new CloneNotSupportedException();
  |     }
  |     
  |     
  |     //======================================================================
  |     // Public methods
  |     //======================================================================
  | 
  |     /**
  |      * 
  |      */
  |     public boolean isMasterNode () 
  |     {
  |         return m_isMasterNode;  
  |     }
  | 
  |     
  |     /**
  |      * Get the UserMessages for the specified user.
  |      * 
  |      * @param userId
  |      * @return
  |      */
  |     /*
  |     public UserMessages getUserMessages (String userId)
  |     {
  |         // handle null keys
  |         if (userId == null)
  |         {
  |             return null;
  |         }
  |          
  |         // return the corresponding UserMessages, or null if it doesn't exist
  |         return (UserMessages) m_userMessagesTable.get(userId);
  |     }
  |     */
  |     
  |     /**
  |      * Get the UserMessages for the specified user, from the specified index to 
the end.
  |      * 
  |      * @param userId
  |      * @param index
  |      * @return
  |      */
  |     public UserMessages getUserMessages (String userId,
  |                                          int index)
  |     {
  |         // handle bad parameters
  |         if ((userId == null) || (index < 0))
  |         {
  |             return null;
  |         }
  |          
  |         // get the UserMessages for the specified user
  |         UserMessages userMessages = (UserMessages) m_userMessagesTable.get(userId);
  |         
  |         if (userMessages != null)
  |         {
  |             // if the index is past the range then return null
  |             if (index > userMessages.getLastIndex())
  |             {
  |                 return null;
  |             }
  |             // if the index is zero then we want the entire thing -- no need to 
get a subset
  |             else if (index == 0)
  |             {
  |                 return userMessages;
  |             }
  |             // return a subset of the original messages
  |             else
  |             {
  |                 // index is within range - copy the messages from the index 
  |                 // to the end into a new UserMessages object and return it
  |                 
  |                 // create the new UserMessages we'll return
  |                 UserMessages newUserMessages = new UserMessages(userId);
  |                 
  |                 // loop over the original messages, copying them into the new 
messages object
  |                 for (int i = index; i <= userMessages.getLastIndex(); i++)
  |                 {
  |                     newUserMessages.addMessage(userMessages.getMessage(i));
  |                 }
  |                 
  |                 // return the messages
  |                 return newUserMessages;
  |             }
  |         }
  |         else
  |         {
  |             // no messages were found for the specified user
  |             return null;
  |         }
  |     }
  |     
  |     
  |     /**
  |      * Add a message for the specified user.  If the specified user doesn't already
  |      * have a UserMessages list then one will be initialized before adding the 
message.
  |      * 
  |      * @param userId
  |      * @param message
  |      */
  |     public void addMessage (String userId,
  |                             String message)
  |     {
  |         // either add to an existing list or create one first before adding to it
  |         if (m_userMessagesTable.containsKey(userId))
  |         {
  |             // get the existing UserMessages for this user
  |             UserMessages userMessages = (UserMessages) 
m_userMessagesTable.get(userId);
  |             
  |             // add the message to the list
  |             userMessages.addMessage(message);
  |         }
  |         else
  |         {
  |             // create a UserMessages for this user
  |             UserMessages userMessages = new UserMessages(userId);
  |             
  |             // add the message to the list
  |             userMessages.addMessage(message);
  |             
  |             // add the user messages list to the hash
  |             m_userMessagesTable.put(userId, userMessages);
  |         }
  |     }
  |     
  |     
  |     /**
  |      * Get the number of messages for the specified user.
  |      * @param userId
  |      * @return
  |      */
  |     public int getNumberOfUserMessages (String userId)
  |     {
  |         if (m_userMessagesTable.containsKey(userId))
  |         {
  |             return ((UserMessages) m_userMessagesTable.get(userId)).size();
  |         }
  |         else
  |         {
  |             return 0;
  |         }
  |     }
  | 
  | }
  | 
  | 
  | 



The MBean classes are being included with my application's EJB Jar file which is part 
of the EAR file which is deployed in the JBOSS_HOME/server/all/deploy directory.

I have modified JBOSS_HOME/server/all/farm/cluster-examples-service.xml by adding the 
following entry:



  | <!-- ===================================================== -->
  |     <!--  This MBean is an example of a cluster Singleton    -->
  |     <!-- ===================================================== -->
  |     <mbean code="com.harborsideplus.grover.mbean.AllUserMessagesSingleton"
  |           name="grover.mbean:service=AllUserMessagesSingleton">
  |     </mbean>
  | 
  |     <!-- ===================================================== -->
  |     <!--    | This is a singleton controller which works similarly to the     -->
  |     <!--    | SchedulerProvider (when a MBean target is used)                 -->
  |     <!-- ===================================================== -->
  |     <mbean code="org.jboss.ha.singleton.HASingletonController"
  |            name="jboss:service=HASingletonController">
  |         <depends>jboss:service=DefaultPartition</depends>
  |         <depends>grover.mbean:service=AllUserMessagesSingleton</depends>
  |         <attribute 
name="TargetName">grover.mbean:service=AllUserMessagesSingleton</attribute>
  |         <attribute name="TargetStartMethod">startSingleton</attribute>
  |         <attribute name="TargetStopMethod">stopSingleton</attribute>
  |      </mbean>
  | 



Any suggestions as to what I am doing wrong ?  Thanks in advance for any ideas, 
feedback, etc.


-James

View the original post : 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3843109#3843109

Reply to the post : 
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3843109


-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to