If you implement the model mbean interface yourself, rather than use the
existingimplementation, then you're in charge of calling load() and store() at
appropriate times -- there's no notion of a container in the JMX spec.
-- Juha
On Wed, 10 Mar 2004, Marco Mistroni wrote:
> Hi all,
> To get acquainted with ModelMBean and persistence, I have
> written
> A very small ModelMBean that implements the PersistenceInterface, and I
> have
> Written dummy load() and store() to see when those two methods are
> called.
> My assumption is that load() was called when the MBean was deployed..
> I built a sar and dropped into the deploy directory.
> However, as I could see from the logs, the load() method is never
> called..
>
> Anyone can help me out?
>
> Here is the code of my ModelMbean, along with its descriptor..
>
> /*
> * Created on Jun 25, 2003
> *
> * To change the template for this generated file go to
> * Window>Preferences>Java>Code Generation>Code and Comments
> */
> package com.marco.config;
> import javax.management.*;
> import java.util.Date;
> import java.util.Vector;
> import java.util.Set;
> import java.util.Hashtable;
> import java.util.Properties;
> import javax.management.timer.*;
> import java.lang.reflect.*;
> import org.jboss.mx.util.*;
> import javax.management.modelmbean.*;
> /**
> * @author mistroni
> *
> * To change the template for this generated type comment go to
> * Window>Preferences>Java>Code Generation>Code and Comments
> */
> public class MyTimer extends org.jboss.system.ServiceMBeanSupport
> implements ModelMBean
> {
>
>
> private MBeanServer server;
> private ObjectName timer;
> private int timeout;
> private int repetitions;
> protected ModelMBeanInfo modelMBeanInfo = null;
> protected Hashtable attributes = new Hashtable();
> protected Hashtable notifications = new Hashtable();
> protected Hashtable constructors = new Hashtable();
> protected Hashtable operations = new Hashtable();
> protected String description = "Description of MBean";
>
>
> public MyTimer() {
> System.err.println("MyTimerService MBean created...");
> try {
> addMBeanInfoData();
>
> } catch(Exception e) {
> System.err.println("Got exception in intializing
> MyTimer\n" + e.toString());
> }
> }
>
>
> /** Persistence Interface */
>
> public void load() throws MBeanException,
> InstanceNotFoundException {
> System.err.println("************ HERE WE SHOULD LOAD MBEAN
> DATA!");
> }
>
> public void store() throws
> MBeanException,InstanceNotFoundException {
> System.err.println("************ HERE WE SHOULD STORE MBEAN
> DATA!");
> }
>
> /** ModelMBean interface */
>
> public void setModelMBeanInfo(ModelMBeanInfo inModelMBeanInfo)
> throws MBeanException {
> modelMBeanInfo = inModelMBeanInfo;
> }
>
> public void setManagedResource(Object mr, String mr_type) throws
> MBeanException {}
>
> public ModelMBeanInfo getModelMBeanInfo() {
> buildDynamicMBeanInfo();
> return modelMBeanInfo;
> }
>
>
> // ModelMBeanBroadcaster interface
>
> public void addNotificationListener(NotificationListener l,
> NotificationFilter f,
> Object hback) {}
>
> public void removeNotificationListener(NotificationListener l)
> throws ListenerNotFoundException {}
>
>
> public void
> addAttributeChangeNotificationListener(NotificationListener l,
> String
> attributeName,
> Object hback)
> throws MBeanException {}
>
> public void
> removeAttributeChangeNotificationListener(NotificationListener l,
> String
> attributeName) throws MBeanException,
>
> ListenerNotFoundException {}
>
> public void sendNotification(String message) throws
> MBeanException {}
>
> // public void sendNotification(Notification notif) throws
> MBeanException {}
>
> public void
> sendAttributeChangeNotification(AttributeChangeNotification notif)
> throws MBeanException {}
>
> public void sendAttributeChangeNotification(Attribute oldValue,
> Attribute newValue) throws MBeanException {}
>
> public MBeanNotificationInfo[] getNotificationInfo() {
> return new MBeanNotificationInfo[]{};
> }
>
> // Here we add informations to be used in MBeanInfo.
> // we have to add all operations, attributes and notifications
> // that our MBeab will have.
> private void addMBeanInfoData() {
> System.err.println("Adding mbeaninfo data..");
>
>
> // Adding operation addNotification
>
> Descriptor d = new DescriptorSupport();
> d.setField("name","testPrint");
> d.setField("descriptorType", "operation");
> d.setField("role", "operation");
>
>
> addMBeanOperation("testPrint", null,
> null, null,
> "testPrint", "void",
> MBeanOperationInfo.ACTION,
> d);
>
>
> }
>
>
> // Code below is generated automatically by MBeanGenerator.
> // You may need to modify it according to your needs :-)
>
> public Object invoke(String method, Object args[],
> String types[]) throws
> MBeanException, ReflectionException {
> try {
> Class c = this.getClass();
> Class sig[] = null;
> if(types != null) {
> sig = new Class[types.length];
> for(int i=0; i < types.length; i++) {
> sig[i] =
> Class.forName(types[i]);
> }
> }
> Method m = c.getDeclaredMethod(method, sig);
> Object returnObject = (Object)m.invoke(this,
> args);
> return returnObject;
> } catch(Exception e) {
> System.err.println("Error in
> DynamicMBeanSupport.invoke():\n" + e.toString());
> return null;
> }
> }
>
>
>
> public Object getAttribute(String name) throws MBeanException,
> ReflectionException {
> try {
> Class c = this.getClass();
> Method m = c.getDeclaredMethod("get" + name,
> null);
> return m.invoke((Object)this, null);
> } catch(Exception e) {
> System.err.println("Exception in
> DynamicMBeanSupport.getAttribute()\n" + e.toString());
> return null;
> }
> }
>
> public void setAttribute(Attribute attribute) throws
> MBeanException, AttributeNotFoundException,
>
> ReflectionException, InvalidAttributeValueException {
> String fname = attribute.getName();
> Object fvalue = attribute.getValue();
> try {
> Class c = this.getClass();
> String type = getType(fname, false, true);
> if(type == null)
> throw new
> AttributeNotFoundException(fname);
>
> Class[] types = {Class.forName(type)};
> Method m = c.getDeclaredMethod("set" + fname,
> types);
>
> Object[] args = {fvalue};
> m.invoke((Object)this, args);
>
> } catch(AttributeNotFoundException e) {
> System.err.println("Exception in
> DynamicMBeanSupport.setAttribute()\n" + e.toString());
> throw e;
> } catch(Exception e) {
> System.err.println("Exception2 in
> DynamicMBeanSupport.setAttribute()\n" + e.toString());
>
> }
> }
>
> public AttributeList setAttributes(AttributeList attributes) {
> Attribute[] atts = (Attribute[])attributes.toArray();
> AttributeList list = new AttributeList();
> for(int i=0; i < atts.length; i++) {
> Attribute a = atts[i];
> try {
> this.setAttribute(a);
> } catch(Exception e) {
> System.err.println("Exception in
> DynamicMBeanSupport.setAttributes()\n" + e.toString());
> }
> } // end for
> return attributes;
> }
>
> public AttributeList getAttributes(String[] names) {
> AttributeList list = new AttributeList();
> for(int i=0; i < names.length; i++) {
> try {
> list.add(new Attribute(names[i],
> this.getAttribute(names[i])));
> } catch(Exception e) {
> System.err.println("Exception in
> DynamicMBeanSupport.getAttributes()\n" + e.toString());
> }
> }
> return list;
> }
>
>
>
> protected void addMBeanOperation(String name, String[]
> paramTypes,
> String[] paramNames, String[]
> paramDescs,
> String desc, String rtype, int
> type,Descriptor d) {
> MBeanParameterInfo[] params = null;
> if(paramTypes != null) {
> params = new
> MBeanParameterInfo[paramTypes.length];
> for(int i=0; i < paramTypes.length; i++) {
> params[i] = new
> MBeanParameterInfo(paramNames[i], paramTypes[i], paramDescs[i]);
> }
> }
> operations.put(name, new ModelMBeanOperationInfo(name,
> desc, params, rtype, type,d));
>
>
> }
>
> protected void addMBeanAttribute(String fname, String ftype,
> boolean read, boolean write,
> boolean is,
> String desc, Descriptor d) {
> attributes.put(fname, new
> ModelMBeanAttributeInfo(fname,ftype, desc, read, write, is,d));
> }
>
> protected void addMBeanNotification(String type, String name,
> String description,Descriptor d) {
> notifications.put(name, new
> ModelMBeanNotificationInfo(new String[] {type}, name, description,d));
> }
>
> protected void addMBeanConstructor(Constructor c, String
> desc,Descriptor d) {
> this.constructors.put(c, new
> ModelMBeanConstructorInfo(desc, c,d));
> }
>
> private void copyInto(Object[] array, Hashtable table) {
> Vector temp = new Vector(table.values());
> temp.copyInto(array);
> }
>
> private String getType(String attName, boolean read, boolean
> write) {
> boolean allowed = true;
> if(attributes.containsKey(attName)) {
> MBeanAttributeInfo temp =
> (MBeanAttributeInfo)attributes.get(attName);
> if(read) {
> if(!temp.isReadable())
> allowed = false;
> }
> if(write) {
> if(!temp.isWritable())
> allowed = false;
> }
>
> if(!allowed)
> return null;
> else
> return temp.getType();
> } else
> return null;
> }
>
> private void buildDynamicMBeanInfo() {
>
> try {
> ModelMBeanOperationInfo[] ops = new
> ModelMBeanOperationInfo[operations.size()];
> copyInto(ops, operations);
>
> ModelMBeanAttributeInfo[] atts = new
> ModelMBeanAttributeInfo[attributes.size()];
> copyInto(atts, attributes);
>
> ModelMBeanConstructorInfo[] cons = new
> ModelMBeanConstructorInfo[constructors.size()];
> copyInto(cons, constructors);
>
> ModelMBeanNotificationInfo[] notifs = new
> ModelMBeanNotificationInfo[notifications.size()];
> copyInto(notifs, notifications);
>
> Descriptor d = new DescriptorSupport();
> d.setField("name", "MyTimer");
> d.setField("descriptorType", "mbean");
> d.setField("persistPolicy","OnTimer");
> d.setField("persistPeriod", "1000");
> modelMBeanInfo = new
> ModelMBeanInfoSupport(this.getClass().getName(), description, atts,
> cons,
> ops,null,d);
>
>
> } catch(Exception e) {
> System.err.println("Exception
> inbuildling modelmbean!");
> e.printStackTrace();
> }
> }
>
>
>
> public MBeanInfo getMBeanInfo() {
> buildDynamicMBeanInfo();
> return (MBeanInfo)modelMBeanInfo;
> }
>
>
> /**
> * @return the name of this MBean
> */
> public String getName() {
> return "MyTimer";
> }
>
>
> public void testPrint() {
> System.err.println("**** Here We Print!*****");
> }
>
> public int getState() {
> return super.getState();
> }
>
> public String getStateString() {
> return super.getStateString();
> }
> }
>
> And here is the descriptor.....
>
> <?xml version="1.0" encoding="UTF-8"?>
> <server>
>
> <mbean code="com.marco.config.MyTimer"
> name="WLSPortal:service=TimeBomb">
> <description>sample for jboss xmbean.dtd</description>
> <descriptors>
> <persistence persistPolicy="OnTimer"
> persistPeriod="2"/>
>
> <state-action-on-update value="RESTART"/>
> <descriptor name='testdescriptor' value='testvalue'/>
> </descriptors>
> <class>com.marco.config.MyTimer</class>
> <operation impact="ACTION">
> <description>testPrint</description>
> <name>testPrint</name>
> </operation>
>
> </mbean>
> </server>
>
> thanx in advance and regards
> marco
>
>
>
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by: IBM Linux Tutorials
> Free Linux tutorial presented by Daniel Robbins, President and CEO of
> GenToo technologies. Learn everything from fundamentals to system
> administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
> _______________________________________________
> JBoss-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/jboss-user
>
--
Juha Lindfors
Director of Training
http://www.jboss.com
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user