What is wrong with ModelMBean and what is the difference wit
arabinow Apr 3, 2003 1:08 PMI am using JBoss 3.0.6.
I am trying to implement the same MBean as DynamicMBean and as ModelMBean.
I call it both times the same way from my code:
 String pulsarName = "com.peerdirect.rmapplications.master.jmx.PulsarStandard" ;
 Object pulsar = Class.forName (pulsarName).newInstance();
 String name = myMBeanServer.getDefaultDomain() + ":type=" + pulsarName;
 myMBeanServer.registerMBean (pulsar, new ObjectName(name)); // line 67
When I implement it as a DynamicMBean, it works OK.
Here is the implementation:
------------- start of implementation -------------------
package com.peerdirect.rmapplications.master.jmx;
import com.peerdirect.rmapplications.master.jms.StatusNotificationClient;
import javax.management.*;
import javax.management.modelmbean.*;
import java.util.Iterator;
import java.lang.Runnable;
import java.io.*;
import org.jboss.mx.modelmbean.*;
import org.jboss.mx.modelmbean.ModelMBeanConstants.*;
public class PulsarStandard extends NotificationBroadcasterSupport
 implements DynamicMBean, Runnable
{
 // support for generic notification listeners
 private NotificationBroadcasterSupport notifier = new NotificationBroadcasterSupport();
 // sequence numbers for notifications
 protected long notifierSequence = 0;
 protected long attrNotifierSequence = 0;
 // mgmt attribute name constants
 final static String PULSE_PERIOD = "PulsePeriodInMills";
 final static String IF_STARTED = "Started";
 // mgmt operation name constants
 final static String START_PULSE = "startPulse";
 final static String STOP_PULSE = "stopPulse";
 // fields for attribute values
 private static final int DEFAULT_PULSE_PERIOD = 1000;
 private static final boolean DEFAULT_STARTED= false;
 private int mPulsePeriod = 0;
 private boolean mStarted = false;
 private StatusNotificationClient mSNC = null;
 private Thread mThread = null;
 // getAttribute implementation
 public PulsarStandard () throws MBeanException
 {
 System.out.println ("PulsarStandard");
 mPulsePeriod = DEFAULT_PULSE_PERIOD;
 mStarted = DEFAULT_STARTED;
 mSNC = new StatusNotificationClient ();
 mThread = new Thread (this);
 startPulse () ;
 }
 public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException
 {
 System.out.println ("getAttribute");
 if (attribute == null || attribute.equals(""))
 throw new IllegalArgumentException("null or empty attribute name");
 // map the named attributes to fields
 if (attribute.equals(PULSE_PERIOD))
 return new Integer (mPulsePeriod);
 else if (attribute.equals(IF_STARTED))
 return new Boolean (mStarted);
 throw new AttributeNotFoundException("Attribute " + attribute + " not found.");
 }
 // getAttributes implementation
 public AttributeList getAttributes (String[] attributes)
 {
 System.out.println ("getAttributes");
 if (attributes == null)
 throw new IllegalArgumentException("null array");
 AttributeList list = new AttributeList();
 for (int i = 0; i < attributes.length; ++i)
 {
 try
 {
 list.add (new Attribute (attributes, getAttribute(attributes)));
 }
 catch (JMException ignored)
 {
 // if the attribute could not be retrieved, skip it
 }
 }
 return list;
 }
 // setAttribute implementation
 public void setAttribute (Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
 MBeanException, ReflectionException
 {
 System.out.println ("setAttribute");
 if (attribute == null) throw new
 AttributeNotFoundException("null attribute");
 // map attributes to fields
 try
 {
 if (attribute.getName().equals(PULSE_PERIOD))
 this.mPulsePeriod = ((Integer)attribute.getValue()).intValue();
 else if (attribute.getName().equals(IF_STARTED))
 this.mStarted = ((Boolean)attribute.getValue()).booleanValue();
 else
 throw new AttributeNotFoundException("attribute " + attribute.getName() + " not found.");
 }
 catch (ClassCastException e)
 {
 throw new InvalidAttributeValueException("Invalid attribute type " + attribute.getValue().getClass().getName());
 }
 }
 // setAttributes implementation
 public AttributeList setAttributes (AttributeList list)
 {
 System.out.println ("setAttributes");
 if (list == null)
 throw new IllegalArgumentException("null list");
 AttributeList results = new AttributeList();
 Iterator it = list.iterator();
 while (it.hasNext())
 {
 try
 {
 Attribute attr = (Attribute)it.next();
 setAttribute(attr);
 results.add(attr);
 }
 catch (JMException ignored)
 {
 // if unable to set the attribute, skip it
 }
 }
 return results;
 }
 // invoke implementation
 public Object invoke(String actionName,
 Object[] params,
 String[] signature) throws MBeanException, ReflectionException {
 System.out.println ("invoke");
 if (actionName == null || actionName.equals(""))
 throw new IllegalArgumentException("no operation");
 // map operation names to methods
 if (actionName.equals(START_PULSE))
 {
 startPulse();
 return null;
 }
 else if (actionName.equals(STOP_PULSE))
 {
 stopPulse ();
 return null;
 }
 else
 throw new UnsupportedOperationException("unknown operation " + actionName);
 }
 // getMBeanInfo implementation
 /*public static MBeanInfo getMBeanInfo()
 {
 return getMBeanInfo1();
 }*/
 public MBeanInfo getMBeanInfo()
 {
 System.out.println ("getMBeanInfo");
 final boolean IS_READABLE = true;
 final boolean IS_WRITABLE = true;
 final boolean IS_IS = true;
 // MBean class and description
 //String className = getClass().getName();
 String className = PulsarStandard.class.getName();
 String description =
 "User resource with dynamic management interface";
 // meta data for 'PULSE_PERIOD' attribute.
 MBeanAttributeInfo mPulsePeriod = new MBeanAttributeInfo(
 PULSE_PERIOD, // name
 int.class.getName(), // type
 "Pulse Period", // description
 IS_READABLE, IS_WRITABLE, !IS_IS // access
 );
 // meta data for 'IF_STARTED' attribute.
 MBeanAttributeInfo mStarted = new MBeanAttributeInfo(
 IF_STARTED, // name
 boolean.class.getName(), // type
 "If the Pulser has Started", // description
 IS_READABLE, !IS_WRITABLE, !IS_IS // access
 );
 // meta data for 'startPulse' operation
 MBeanOperationInfo startPulse = new MBeanOperationInfo(
 START_PULSE, // name
 "Start the pulsar", // description
 null, // signature
 void.class.getName(), // return type
 MBeanOperationInfo.ACTION // impact
 );
 // meta data for 'stopPulse' operation
 MBeanOperationInfo stopPulse = new MBeanOperationInfo(
 STOP_PULSE, // name
 "Stop the pulsar", // description
 null, // signature
 void.class.getName(), // return type
 MBeanOperationInfo.ACTION // impact
 );
 // mbean constructors
 MBeanConstructorInfo defaultConstructor =
 new MBeanConstructorInfo(
 "Default Constructor",
 "Creates a new Pulsar", null
 );
 // attribute, constructor and operation lists
 MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[] {mPulsePeriod, mStarted};
 MBeanConstructorInfo[] constructors = new MBeanConstructorInfo[] {defaultConstructor};
 MBeanOperationInfo[] operations = new MBeanOperationInfo[] {startPulse, stopPulse};
 // return the MBeanInfo
 return new MBeanInfo (className, description, attributes, constructors, operations, null);
 }
 public void startPulse ()
 {
 System.out.println ("startPulse");
 mThread.start ();
 try
 {
 mSNC.connect();
 mStarted = true ;
 }
 catch (Exception e)
 {
 mStarted = false ;
 }
 }
 public void stopPulse ()
 {
 System.out.println ("stopPulse");
 mThread.stop ();
 mSNC.disconnect();
 mStarted = false ;
 }
 public void run ()
 {
 System.out.println ("run");
 try
 {
 while (true)
 {
 mThread.sleep (mPulsePeriod);
 if (mStarted)
 {
 System.out.println("Pulsing");
 mSNC.sendPulse();
 }
 }
 }
 catch (Exception ex)
 {
 ex.printStackTrace();
 }
 }
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
----------------- end of implementation ---------------
However, whan I implement it as a ModelMBean (not directly ModelMBean, because I need to use PersistPolicy; I tried to implement it as ModelBase or as XMBean - both times) it does not wortk - it bring out an exception (which is not brough out when I use DynamicMBean implementation of the same Mbean):
MBeanException: preRegister() failed
 [ObjectName='DefaultDomain:type=com.peerdirect.rmapplications.master.jmx.PulsarStandard',Class=com.peerdirect.rmapplications.master.jmx.PulsarStandard
 (com.peerdirect.rmapplications.master.jmx.PulsarStandard@5bdc50)]
 Cause: java.lang.NullPointerException
 at
 org.jboss.mx.server.registry.BasicMBeanRegistry.registerMBean(BasicMBeanRegistry.java:187)
 at org.jboss.mx.server.MBeanServerImpl.registerMBean(MBeanServerImpl.java:975)
 at org.jboss.mx.server.MBeanServerImpl.registerMBean(MBeanServerImpl.java:302)
 at com.peerdirect.rmapplications.agent.BaseAgent.(BaseAgent.java:67)
 at com.peerdirect.rmapplications.agent.MasterAgent.(MasterAgent.java:5)
 at com.peerdirect.rmapplications.agent.MasterAgent.main(MasterAgent.java:15)
Here is my implementation as ModelBase (absolutely the same thing happens when I use XMBean instead of ModelBase):
--------------------- start of implementation --------
package com.peerdirect.rmapplications.master.jmx;
import com.peerdirect.rmapplications.master.jms.StatusNotificationClient;
import javax.management.*;
import javax.management.modelmbean.*;
import java.util.Iterator;
import java.lang.Runnable;
import java.io.*;
import org.jboss.mx.modelmbean.*;
import org.jboss.mx.modelmbean.ModelMBeanConstants.*;
public class PulsarStandard extends ModelBase
 implements Runnable
{
 // support for generic notification listeners
 private NotificationBroadcasterSupport notifier = new NotificationBroadcasterSupport();
 // sequence numbers for notifications
 protected long notifierSequence = 0;
 protected long attrNotifierSequence = 0;
 // mgmt attribute name constants
 final static String PULSE_PERIOD = "PulsePeriodInMills";
 final static String IF_STARTED = "Started";
 // mgmt operation name constants
 final static String START_PULSE = "startPulse";
 final static String STOP_PULSE = "stopPulse";
 // fields for attribute values
 private static final int DEFAULT_PULSE_PERIOD = 1000;
 private static final boolean DEFAULT_STARTED= false;
 private int mPulsePeriod = 0;
 private boolean mStarted = false;
 private StatusNotificationClient mSNC = null;
 private Thread mThread = null;
 protected ModelMBeanInfo metadata = null;
 protected Object resource = null;
 protected String resourceType = null;
 public boolean isSupportedResourceType(String resourceType)
 {
 System.out.println("isSupportedResourceType");
 return true;
 }
 // getAttribute implementation
 public PulsarStandard () throws MBeanException
 {
 super ();
 System.out.println ("PulsarStandard");
 mPulsePeriod = DEFAULT_PULSE_PERIOD;
 mStarted = DEFAULT_STARTED;
 mSNC = new StatusNotificationClient ();
 mThread = new Thread (this);
 startPulse () ;
 }
 public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException
 {
 System.out.println ("getAttribute");
 if (attribute == null || attribute.equals(""))
 throw new IllegalArgumentException("null or empty attribute name");
 // map the named attributes to fields
 if (attribute.equals(PULSE_PERIOD))
 return new Integer (mPulsePeriod);
 else if (attribute.equals(IF_STARTED))
 return new Boolean (mStarted);
 throw new AttributeNotFoundException("Attribute " + attribute + " not found.");
 }
 // getAttributes implementation
 public AttributeList getAttributes (String[] attributes)
 {
 System.out.println ("getAttributes");
 if (attributes == null)
 throw new IllegalArgumentException("null array");
 AttributeList list = new AttributeList();
 for (int i = 0; i < attributes.length; ++i)
 {
 try
 {
 list.add (new Attribute (attributes, getAttribute(attributes)));
 }
 catch (JMException ignored)
 {
 // if the attribute could not be retrieved, skip it
 }
 }
 return list;
 }
 // setAttribute implementation
 public void setAttribute (Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException,
 MBeanException, ReflectionException
 {
 System.out.println ("setAttribute");
 if (attribute == null) throw new
 AttributeNotFoundException("null attribute");
 // map attributes to fields
 try
 {
 if (attribute.getName().equals(PULSE_PERIOD))
 this.mPulsePeriod = ((Integer)attribute.getValue()).intValue();
 else if (attribute.getName().equals(IF_STARTED))
 this.mStarted = ((Boolean)attribute.getValue()).booleanValue();
 else
 throw new AttributeNotFoundException("attribute " + attribute.getName() + " not found.");
 }
 catch (ClassCastException e)
 {
 throw new InvalidAttributeValueException("Invalid attribute type " + attribute.getValue().getClass().getName());
 }
 }
 // setAttributes implementation
 public AttributeList setAttributes (AttributeList list)
 {
 System.out.println ("setAttributes");
 if (list == null)
 throw new IllegalArgumentException("null list");
 AttributeList results = new AttributeList();
 Iterator it = list.iterator();
 while (it.hasNext())
 {
 try
 {
 Attribute attr = (Attribute)it.next();
 setAttribute(attr);
 results.add(attr);
 }
 catch (JMException ignored)
 {
 // if unable to set the attribute, skip it
 }
 }
 return results;
 }
 // invoke implementation
 public Object invoke(String actionName,
 Object[] params,
 String[] signature) throws MBeanException, ReflectionException {
 System.out.println ("invoke");
 if (actionName == null || actionName.equals(""))
 throw new IllegalArgumentException("no operation");
 // map operation names to methods
 if (actionName.equals(START_PULSE))
 {
 startPulse();
 return null;
 }
 else if (actionName.equals(STOP_PULSE))
 {
 stopPulse ();
 return null;
 }
 else
 throw new UnsupportedOperationException("unknown operation " + actionName);
 }
 // getMBeanInfo implementation
 /*public static MBeanInfo getMBeanInfo()
 {
 return getMBeanInfo1();
 }*/
 public MBeanInfo getMBeanInfo()
 {
 System.out.println ("getMBeanInfo");
 //final boolean IS_READABLE = true;
 //final boolean IS_WRITABLE = true;
 //final boolean IS_IS = true;
 // MBean class and description
 //String className = getClass().getName();
 String className = PulsarStandard.class.getName();
 String description =
 "User resource with model management interface";
 // build 'RoomName' read-write attribute
 /*Descriptor descr_my = new DescriptorSupport();
 descr_my.setField(PERSIST_POLICY, "OnUpdate");
 descr_my.setField(PERSIST_LOCATION, "c:\\aa");
 descr_my.setField(PERSIST_NAME, "storage.txt");
 System.out.println ("Valid " + descr_my.isValid());*/
 // meta data for 'PULSE_PERIOD' attribute.
 ModelMBeanAttributeInfo mPulsePeriod = new ModelMBeanAttributeInfo(
 PULSE_PERIOD, // name
 int.class.getName(), // type
 "Pulse Period", // description
 IS_READABLE, IS_WRITABLE, !IS_IS//, // access
 //descr_my
 );
 // meta data for 'IF_STARTED' attribute.
 ModelMBeanAttributeInfo mStarted = new ModelMBeanAttributeInfo(
 IF_STARTED, // name
 boolean.class.getName(), // type
 "If the Pulser has Started", // description
 IS_READABLE, !IS_WRITABLE, !IS_IS // access
 );
 // meta data for 'startPulse' operation
 ModelMBeanOperationInfo startPulse = new ModelMBeanOperationInfo(
 START_PULSE, // name
 "Start the pulsar", // description
 null, // signature
 void.class.getName(), // return type
 MBeanOperationInfo.ACTION // impact
 );
 // meta data for 'stopPulse' operation
 ModelMBeanOperationInfo stopPulse = new ModelMBeanOperationInfo(
 STOP_PULSE, // name
 "Stop the pulsar", // description
 null, // signature
 void.class.getName(), // return type
 MBeanOperationInfo.ACTION // impact
 );
 // mbean constructors
 ModelMBeanConstructorInfo defaultConstructor =
 new ModelMBeanConstructorInfo(
 "Default Constructor",
 "Creates a new Pulsar", null
 );
 // attribute, constructor and operation lists
 ModelMBeanAttributeInfo[] attributes = new ModelMBeanAttributeInfo[] {mPulsePeriod, mStarted};
 ModelMBeanConstructorInfo[] constructors = new ModelMBeanConstructorInfo[] {defaultConstructor};
 ModelMBeanOperationInfo[] operations = new ModelMBeanOperationInfo[] {startPulse, stopPulse};
 // return the MBeanInfo
 return new ModelMBeanInfoSupport (className, description, attributes, constructors, operations, null);
 }
 // RW attributes
 /*
 public int getPulsePeriodInMills ()
 {
 return mPulsePeriod;
 }
 public void setPulsePeriodInMills (int pPulsePeriod)
 {
 mPulsePeriod = pPulsePeriod ;
 }
 public boolean getStarted ()
 {
 return mStarted;
 }
 */
 public void startPulse ()
 {
 System.out.println ("startPulse");
 mThread.start ();
 try
 {
 mSNC.connect();
 mStarted = true ;
 }
 catch (Exception e)
 {
 mStarted = false ;
 }
 }
 public void stopPulse ()
 {
 System.out.println ("stopPulse");
 mThread.stop ();
 mSNC.disconnect();
 mStarted = false ;
 }
 public void run ()
 {
 System.out.println ("run");
 try
 {
 while (true)
 {
 mThread.sleep (mPulsePeriod);
 if (mStarted)
 {
 System.out.println("Pulsing");
 mSNC.sendPulse();
 }
 }
 }
 catch (Exception ex)
 {
 ex.printStackTrace();
 }
 }
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
--------------------- end of implementation --------
 
    