User: schaefera Date: 02/01/18 10:48:12 Modified: src/main/org/jboss/util Scheduler.java SchedulerMBean.java Added: src/main/org/jboss/util SchedulableExample.java SchedulableExampleMBean.java Log: Enable the Scheduler to work with another Schedulable MBean instead of the Schedulable class Revision Changes Path 1.16 +306 -74 jboss/src/main/org/jboss/util/Scheduler.java Index: Scheduler.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/util/Scheduler.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- Scheduler.java 2002/01/17 21:57:27 1.15 +++ Scheduler.java 2002/01/18 18:48:12 1.16 @@ -89,40 +89,56 @@ // ------------------------------------------------------------------------- // Constants // ------------------------------------------------------------------------- - + + /** Class logger. */ + private static final Logger log = Logger.getLogger( Scheduler.class ); + public static String JNDI_NAME = "scheduler:domain"; public static String JMX_NAME = "scheduler"; - + + private static final int NOTIFICATION = 0; + private static final int DATE = 1; + private static final int REPETITIONS = 2; + private static final int SCHEDULER_NAME = 3; + private static final int NULL = 4; + // ------------------------------------------------------------------------- // Members // ------------------------------------------------------------------------- - - /** Class logger. */ - private static final Logger log = Logger.getLogger( Scheduler.class ); - + private long mActualSchedulePeriod; private long mRemainingRepetitions = 0; private int mActualSchedule = -1; private ObjectName mTimer; private Schedulable mSchedulable; - +//as private Object mSchedulableMBeanObjectName; + private boolean mScheduleIsStarted = false; private boolean mWaitForNextCallToStop = false; private boolean mStartOnStart = false; private boolean mIsRestartPending = true; - + // Pending values which can be different to the actual ones + private boolean mUseMBean = false; + private Class mSchedulableClass; private String mSchedulableArguments; private String[] mSchedulableArgumentList = new String[ 0 ]; private String mSchedulableArgumentTypes; private Class[] mSchedulableArgumentTypeList = new Class[ 0 ]; + + private ObjectName mSchedulableMBean; + private String mSchedulableMBeanMethod; + private String mSchedulableMBeanMethodName; + private int[] mSchedulableMBeanArguments = new int[ 0 ]; + private String[] mSchedulableMBeanArgumentTypes = new String[ 0 ]; + private DateFormat mDateFormatter; private Date mStartDate; private String mStartDateString; private long mSchedulePeriod; private long mInitialRepetitions; - + // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- @@ -165,17 +181,34 @@ if( !isStarted() ) { try { // Check the given attributes if correct - if( mSchedulableClass == null ) { - log.debug( "Schedulable Class is not set" ); - throw new InvalidParameterException( - "Schedulable Class must be set" - ); - } - if( mSchedulableArgumentList.length != mSchedulableArgumentTypeList.length ) { - log.debug( "Schedulable Class Arguments and Types do not match in length" ); - throw new InvalidParameterException( - "Schedulable Class Arguments and Types do not match in length" - ); + if( mUseMBean ) { + if( mSchedulableMBean == null ) { + log.debug( "Schedulable MBean Object Name is not set" ); + throw new InvalidParameterException( + "Schedulable MBean must be set" + ); + } + if( mSchedulableMBeanMethodName == null ) { + mSchedulableMBeanMethodName = "perform"; + mSchedulableMBeanArguments = new int[] { DATE, REPETITIONS }; + mSchedulableMBeanArgumentTypes = new String[] { + Date.class.getName(), + Integer.TYPE.getName() + }; + } + } else { + if( mSchedulableClass == null ) { + log.debug( "Schedulable Class is not set" ); + throw new InvalidParameterException( + "Schedulable Class must be set" + ); + } + if( mSchedulableArgumentList.length != mSchedulableArgumentTypeList.length ) { + log.debug( "Schedulable Class Arguments and Types do not match in length" ); + throw new InvalidParameterException( + "Schedulable Class Arguments and Types do not match in length" + ); + } } if( mSchedulePeriod <= 0 ) { log.debug( "Schedule Period is less than 0 (ms)" ); @@ -183,53 +216,55 @@ "Schedule Period must be set and greater than 0 (ms)" ); } - // Create all the Objects for the Constructor to be called - Object[] lArgumentList = new Object[ mSchedulableArgumentTypeList.length ]; - try { - for( int i = 0; i < mSchedulableArgumentTypeList.length; i++ ) { - Class lClass = mSchedulableArgumentTypeList[ i ]; - if( lClass == Boolean.TYPE ) { - lArgumentList[ i ] = new Boolean( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Integer.TYPE ) { - lArgumentList[ i ] = new Integer( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Long.TYPE ) { - lArgumentList[ i ] = new Long( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Short.TYPE ) { - lArgumentList[ i ] = new Short( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Float.TYPE ) { - lArgumentList[ i ] = new Float( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Double.TYPE ) { - lArgumentList[ i ] = new Double( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Byte.TYPE ) { - lArgumentList[ i ] = new Byte( mSchedulableArgumentList[ i ] ); - } else - if( lClass == Character.TYPE ) { - lArgumentList[ i ] = new Character( mSchedulableArgumentList[ i ].charAt( 0 ) ); - } else { - Constructor lConstructor = lClass.getConstructor( new Class[] { String.class } ); - lArgumentList[ i ] = lConstructor.newInstance( new Object[] { mSchedulableArgumentList[ i ] } ); + if( !mUseMBean ) { + // Create all the Objects for the Constructor to be called + Object[] lArgumentList = new Object[ mSchedulableArgumentTypeList.length ]; + try { + for( int i = 0; i < mSchedulableArgumentTypeList.length; i++ ) { + Class lClass = mSchedulableArgumentTypeList[ i ]; + if( lClass == Boolean.TYPE ) { + lArgumentList[ i ] = new Boolean( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Integer.TYPE ) { + lArgumentList[ i ] = new Integer( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Long.TYPE ) { + lArgumentList[ i ] = new Long( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Short.TYPE ) { + lArgumentList[ i ] = new Short( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Float.TYPE ) { + lArgumentList[ i ] = new Float( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Double.TYPE ) { + lArgumentList[ i ] = new Double( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Byte.TYPE ) { + lArgumentList[ i ] = new Byte( mSchedulableArgumentList[ i ] ); + } else + if( lClass == Character.TYPE ) { + lArgumentList[ i ] = new Character( mSchedulableArgumentList[ i ].charAt( 0 ) ); + } else { + Constructor lConstructor = lClass.getConstructor( new Class[] { String.class } ); + lArgumentList[ i ] = lConstructor.newInstance( new Object[] { mSchedulableArgumentList[ i ] } ); + } } } - } - catch( Exception e ) { - log.error( "Could not load or create constructor argument", e ); - throw new InvalidParameterException( "Could not load or create a constructor argument" ); - } - try { - // Check if constructor is found - Constructor lSchedulableConstructor = mSchedulableClass.getConstructor( mSchedulableArgumentTypeList ); - // Create an instance of it - mSchedulable = (Schedulable) lSchedulableConstructor.newInstance( lArgumentList ); - } - catch( Exception e ) { - log.error( "Could not find the constructor or create Schedulable instance", e ); - throw new InvalidParameterException( "Could not find the constructor or create the Schedulable Instance" ); + catch( Exception e ) { + log.error( "Could not load or create constructor argument", e ); + throw new InvalidParameterException( "Could not load or create a constructor argument" ); + } + try { + // Check if constructor is found + Constructor lSchedulableConstructor = mSchedulableClass.getConstructor( mSchedulableArgumentTypeList ); + // Create an instance of it + mSchedulable = (Schedulable) lSchedulableConstructor.newInstance( lArgumentList ); + } + catch( Exception e ) { + log.error( "Could not find the constructor or create Schedulable instance", e ); + throw new InvalidParameterException( "Could not find the constructor or create the Schedulable Instance" ); + } } mRemainingRepetitions = mInitialRepetitions; @@ -279,14 +314,25 @@ Long.TYPE.getName() } ) ).intValue(); - // Register the notification listener at the MBeanServer - getServer().addNotificationListener( - mTimer, - new Listener( mSchedulable ), - new Scheduler.NotificationFilter( new Integer( mActualSchedule ) ), - // No object handback necessary - null - ); + if( mUseMBean ) { + // Register the notification listener at the MBeanServer + getServer().addNotificationListener( + mTimer, + new MBeanListener( mSchedulableMBean ), + new Scheduler.NotificationFilter( new Integer( mActualSchedule ) ), + // No object handback necessary + null + ); + } else { + // Register the notification listener at the MBeanServer + getServer().addNotificationListener( + mTimer, + new Listener( mSchedulable ), + new Scheduler.NotificationFilter( new Integer( mActualSchedule ) ), + // No object handback necessary + null + ); + } mScheduleIsStarted = true; mIsRestartPending = false; } @@ -461,7 +507,105 @@ mSchedulableArgumentTypes = pTypeList; mIsRestartPending = true; } - + + public String getSchedulableMBean() { + return mSchedulableMBean == null ? + null : + mSchedulableMBean.toString(); + } + + public void setSchedulableMBean( String pSchedulableMBean ) + throws InvalidParameterException + { + if( pSchedulableMBean == null ) { + throw new InvalidParameterException( "Schedulable MBean must be specified" ); + } + try { + mSchedulableMBean = new ObjectName( pSchedulableMBean ); + mUseMBean = true; + } + catch( MalformedObjectNameException mone ) { + log.error( "Schedulable MBean Object Name is malformed", mone ); + throw new InvalidParameterException( "Schedulable MBean is not correctly formatted" ); + } + } + + public String getSchedulableMBeanMethod() { + return mSchedulableMBeanMethod; + } + + public void setSchedulableMBeanMethod( String pSchedulableMBeanMethod ) + throws InvalidParameterException + { + if( pSchedulableMBeanMethod == null ) { + mSchedulableMBeanMethod = null; + return; + } + int lIndex = pSchedulableMBeanMethod.indexOf( '(' ); + String lMethodName = ""; + if( lIndex < 0 ) { + lMethodName = pSchedulableMBeanMethod.trim(); + mSchedulableMBeanArguments = new int[ 0 ]; + mSchedulableMBeanArgumentTypes = new String[ 0 ]; + } else + if( lIndex > 0 ) { + lMethodName = pSchedulableMBeanMethod.substring( 0, lIndex ).trim(); + } + if( lMethodName.equals( "" ) ) { + lMethodName = "perform"; + } + if( lIndex >= 0 ) { + int lIndex2 = pSchedulableMBeanMethod.indexOf( ')' ); + if( lIndex2 < lIndex ) { + throw new InvalidParameterException( "Schedulable MBean Method: closing bracket must be after opening bracket" ); + } + if( lIndex2 < pSchedulableMBeanMethod.length() - 1 ) { + String lRest = pSchedulableMBeanMethod.substring( lIndex2 + 1 ).trim(); + if( lRest.length() > 0 ) { + throw new InvalidParameterException( "Schedulable MBean Method: nothing should be after closing bracket" ); + } + } + String lArguments = pSchedulableMBeanMethod.substring( lIndex + 1, lIndex2 ).trim(); + if( lArguments.equals( "" ) ) { + mSchedulableMBeanArguments = new int[ 0 ]; + mSchedulableMBeanArgumentTypes = new String[ 0 ]; + } else { + StringTokenizer lTokenizer = new StringTokenizer( lArguments, "," ); + mSchedulableMBeanArguments = new int[ lTokenizer.countTokens() ]; + mSchedulableMBeanArgumentTypes = new String[ lTokenizer.countTokens() ]; + for( int i = 0; lTokenizer.hasMoreTokens(); i++ ) { + String lToken = lTokenizer.nextToken().trim(); + if( lToken.equals( "NOTIFICATION" ) ) { + mSchedulableMBeanArguments[ i ] = NOTIFICATION; + mSchedulableMBeanArgumentTypes[ i ] = Notification.class.getName(); + } else + if( lToken.equals( "DATE" ) ) { + mSchedulableMBeanArguments[ i ] = DATE; + mSchedulableMBeanArgumentTypes[ i ] = Date.class.getName(); + } else + if( lToken.equals( "REPETITIONS" ) ) { + mSchedulableMBeanArguments[ i ] = REPETITIONS; + mSchedulableMBeanArgumentTypes[ i ] = Long.TYPE.getName(); + } else + if( lToken.equals( "SCHEDULER_NAME" ) ) { + mSchedulableMBeanArguments[ i ] = SCHEDULER_NAME; + mSchedulableMBeanArgumentTypes[ i ] = ObjectName.class.getName(); + } else { + mSchedulableMBeanArguments[ i ] = NULL; + //AS ToDo: maybe later to check if this class exists ! + mSchedulableMBeanArgumentTypes[ i ] = lToken; + } + } + } + } + mSchedulableMBeanMethodName = lMethodName; + mSchedulableMBeanMethod = pSchedulableMBeanMethod; + } + + public boolean isUsingMBean() { + return mUseMBean; + } + public long getSchedulePeriod() { return mSchedulePeriod; } @@ -530,6 +674,10 @@ return mIsRestartPending; } + public boolean isStartAtStartup() { + return mStartOnStart; + } + public void setStartAtStartup( boolean pStartAtStartup ) { mStartOnStart = pStartAtStartup; } @@ -620,6 +768,90 @@ lTimeStamp, getRemainingRepetitions() ); + log.debug( "Remaining Repititions: " + getRemainingRepetitions() + + ", wait for next call to stop: " + mWaitForNextCallToStop ); + if( getRemainingRepetitions() == 0 || mWaitForNextCallToStop ) { + stopSchedule( true ); + } + } + } + else { + // Schedule is stopped therefore remove the Schedule + getServer().invoke( + mTimer, + "removeNotification", + new Object[] { + new Integer( mActualSchedule ) + }, + new String[] { + "java.lang.Integer", + } + ); + mActualSchedule = -1; + } + } + catch( Exception e ) { + e.printStackTrace(); + } + } + } + + public class MBeanListener + implements NotificationListener + { + + private ObjectName mDelegate; + + public MBeanListener( ObjectName pDelegate ) { + mDelegate = pDelegate; + } + + public void handleNotification( + Notification pNotification, + Object pHandback + ) { + log.debug( "MBeanListener.handleNotification(), notification: " + pNotification ); + try { + // If schedule is started invoke the schedule method on the Schedulable instance + log.debug( "Scheduler is started: " + isStarted() ); + Date lTimeStamp = new Date( pNotification.getTimeStamp() ); + if( isStarted() ) { + if( getRemainingRepetitions() > 0 || getRemainingRepetitions() < 0 ) { + if( mRemainingRepetitions > 0 ) { + mRemainingRepetitions--; + } + Object[] lArguments = new Object[ mSchedulableMBeanArguments.length ]; + for( int i = 0; i < lArguments.length; i++ ) { + switch( mSchedulableMBeanArguments[ i ] ) { + case NOTIFICATION: + lArguments[ i ] = pNotification; + break; + case DATE: + lArguments[ i ] = lTimeStamp; + break; + case REPETITIONS: + lArguments[ i ] = new Long( mRemainingRepetitions ); + break; + case SCHEDULER_NAME: + lArguments[ i ] = getServiceName(); + break; + default: + lArguments[ i ] = null; + } + } + log.debug( "MBean Arguments are: " + java.util.Arrays.asList( lArguments ) ); + log.debug( "MBean Arguments Types are: " + java.util.Arrays.asList( mSchedulableMBeanArgumentTypes ) ); + try { + getServer().invoke( + mDelegate, + mSchedulableMBeanMethodName, + lArguments, + mSchedulableMBeanArgumentTypes + ); + } + catch( javax.management.RuntimeOperationsException roe ) { + log.error( "Caught ROE in Schedulable MBean Call", roe.getTargetException() ); + } log.debug( "Remaining Repititions: " + getRemainingRepetitions() + ", wait for next call to stop: " + mWaitForNextCallToStop ); if( getRemainingRepetitions() == 0 || mWaitForNextCallToStop ) { 1.9 +79 -1 jboss/src/main/org/jboss/util/SchedulerMBean.java Index: SchedulerMBean.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/util/SchedulerMBean.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SchedulerMBean.java 2002/01/17 21:57:27 1.8 +++ SchedulerMBean.java 2002/01/18 18:48:12 1.9 @@ -14,7 +14,14 @@ /** * This interface defines the manageable interface for a Scheduler Service * allowing the client to create a Schedulable instance which is then run - * by this service at given times. + * by this service at given times or to use a MBean which is called by this + * service at given times. + * <br> + * <b>Attention: </b> You have two ways to specify the Schedulable. Either + * you specify a Schedulable Class which is created and used by the Scheduler + * or you specify a JMX MBean which the specified method is called. Note that + * the last method of {@link #setSchedulableClass} or {@link #setSchedulableMBean} + * defines which one is used. Therefore you should <b>never mixed these two</b>. * * @author <a href="mailto:[EMAIL PROTECTED]">Andreas Schaefer</a> **/ @@ -119,6 +126,72 @@ throws InvalidParameterException; /** + * @return Object Name if a Schedulalbe MBean is set + **/ + public String getSchedulableMBean(); + + /** + * Sets the fully qualified JMX MBean name of the Schedulable MBean to be called. + * <b>Attention: </b>if set the all values set by {@link #setSchedulableClass}, + * {@link #setSchedulableArguments} and {@link #setSchedulableArgumentTypes} are + * cleared and not used anymore. Therefore only use either Schedulable Class or + * Schedulable MBean. If {@link #setSchedulableMBeanMethod} is not set then the + * schedule method as in the {@link Schedulable#perform} will be called with the + * same arguments. Also note that the Object Name will not be checked if the + * MBean is available. If the MBean is not available it will not be called but + * the remaining repetitions will be decreased. + * + * @param pSchedulableMBean JMX MBean Object Name which should be called. + * + * @throws InvalidParameterException If the given value is an valid Object Name. + **/ + public void setSchedulableMBean( String pSchedulableMBean ) + throws InvalidParameterException; + + /** + * @return Schedulable MBean Method description if set + **/ + public String getSchedulableMBeanMethod(); + + /** + * Sets the method name to be called on the Schedulable MBean. It can optionally be + * followed by an opening bracket, list of attributes (see below) and a closing bracket. + * The list of attributes can contain: + * <ul> + * <li>NOTIFICATION which will be replaced by the timers notification instance + * (javax.management.Notification)</li> + * <li>DATE which will be replaced by the date of the notification call + * (java.util.Date)</li> + * <li>REPETITIONS which will be replaced by the number of remaining repetitions + * (long)</li> + * <li>SCHEDULER_NAME which will be replaced by the Object Name of the Scheduler + * (javax.management.ObjectName)</li> + * <li>any full qualified Class name which the Scheduler will be set a "null" value + * for it</li> + * </ul> + * <br> + * An example could be: "doSomething( NOTIFICATION, REPETITIONS, java.lang.String )" + * where the Scheduler will pass the timer's notification instance, the remaining + * repetitions as int and a null to the MBean's doSomething() method which must + * have the following signature: doSomething( javax.management.Notification, long, + * java.lang.String ). + * + * @param pSchedulableMBeanMethod Name of the method to be called optional followed + * by method arguments (see above). + * + * @throws InvalidParameterException If the given value is not of the right + * format + **/ + public void setSchedulableMBeanMethod( String pSchedulableMBeanMethod ) + throws InvalidParameterException; + + /** + * @return True if the Scheduler uses a Schedulable MBean, false if it uses a + * Schedulable class + **/ + public boolean isUsingMBean(); + + /** * @return Schedule Period between two scheduled calls in Milliseconds. It will always * be bigger than 0 except it returns -1 then the schedule is stopped. **/ @@ -197,6 +270,11 @@ * @return True if any attributes are changed but the Schedule is not restarted yet. **/ public boolean isRestartPending(); + + /** + * @return True if the Schedule when the Scheduler is started + **/ + public boolean isStartAtStartup(); /** * Set the scheduler to start when MBean started or not. Note that this method only 1.1 jboss/src/main/org/jboss/util/SchedulableExample.java Index: SchedulableExample.java =================================================================== /* * JBoss, the OpenSource EJB server * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.util; import java.security.InvalidParameterException; import java.util.Date; import javax.management.MalformedObjectNameException; import javax.management.MBeanServer; import javax.management.Notification; import javax.management.timer.TimerNotification; import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.management.ObjectName; import org.jboss.logging.Logger; import org.jboss.system.ServiceMBeanSupport; /** * Scheduler Instance to allow clients to run this as a scheduling service for * any Schedulable instances. * <br> * ATTENTION: The scheduler instance only allows to run one schedule at a time. * Therefore when you want to run two schedules create to instances with this * MBean. Suggested Object Name for the MBean are:<br> * jboss:service=Scheduler,schedule=<you schedule name><br> * This way you should not run into a name conflict. * * @author <a href="mailto:[EMAIL PROTECTED]">Andreas Schaefer</a> * @author Cameron (camtabor) * * <p><b>Revisions:</b></p> * <p><b>20010814 Cameron:</b> * <ul> * <li>Checks if the TimerMBean is already loaded</li> * <li>Created a SchedulerNotificationFilter so that each Scheduler only * get its notifications</li> * <li>Stop was broken because removeNotification( Integer ) was broken</li> * </ul> * </p> * <p><b>20011026 Andy:</b> * <ul> * <li>Move the SchedulerNotificationFilter to become an internal class * and renamed to NotificationFilter</li> * <li>MBean is not bind/unbind to JNDI server anymore</li> * </ul> * </p> * <p><b>20020117 Andy:</b> * <ul> * <li>Change the behaviour when the Start Date is in the past. Now the * Scheduler will behave as the Schedule is never stopped and find * the next available time to start with respect to the settings. * Therefore you can restart JBoss without adjust your Schedule * every time. BUT you will still loose the calls during the Schedule * was donw.</li> * <li>Added parsing capabilities to setInitialStartDate. Now NOW: current time, * and a string in a format the SimpleDataFormat understand in your environment * (US: m/d/yy h:m a) but of course the time in ms since 1/1/1970.</li> * <li>Some fixes like the stopping a Schedule even if it already stopped etc.</li> * </ul> * </p> **/ public class SchedulableExample extends ServiceMBeanSupport implements SchedulableExampleMBean { // ------------------------------------------------------------------------- // Constants // ------------------------------------------------------------------------- /** Class logger. */ private static final Logger log = Logger.getLogger( SchedulableExample.class ); // ------------------------------------------------------------------------- // Members // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- /** * Default (no-args) Constructor **/ public SchedulableExample() { } // ------------------------------------------------------------------------- // SchedulableExampleMBean Methods // ------------------------------------------------------------------------- public void hit( Notification lNotification, Date lDate, long lRepetitions, ObjectName lName, String lTest ) { log.info( "got hit" + ", notification: " + lNotification + ", date: " + lDate + ", remaining repetitions: " + lRepetitions + ", scheduler name: " + lName + ", test string: " + lTest ); } // ------------------------------------------------------------------------- // Methods // ------------------------------------------------------------------------- public ObjectName getObjectName( MBeanServer pServer, ObjectName pName ) throws MalformedObjectNameException { return new ObjectName( OBJECT_NAME ); } public String getName() { return "JBoss Schedulable Example MBean"; } } 1.1 jboss/src/main/org/jboss/util/SchedulableExampleMBean.java Index: SchedulableExampleMBean.java =================================================================== /* * JBoss, the OpenSource J2EE webOS * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.util; import java.util.Date; import javax.management.Notification; import javax.management.ObjectName; import org.jboss.system.ServiceMBean; /** * * @author <a href="mailto:[EMAIL PROTECTED]">Andreas Schaefer</a> **/ public interface SchedulableExampleMBean extends ServiceMBean { // ------------------------------------------------------------------------- // Constants // ------------------------------------------------------------------------- public static final String OBJECT_NAME = "jboss:type=example,name=schedulable"; // ------------------------------------------------------------------------- // Methods // ------------------------------------------------------------------------- public void hit( Notification lNotification, Date lDate, long lRepetitions, ObjectName lName, String lTest ); }
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development