Workerpublic abstract class Worker extends Basic implements RunnableBase class for the workers in the sample application |
Fields Summary |
---|
public static final String | OBJECT_NAME | Queue | _queue | int | _workFactor | long | _numberOfUnitsProcessed | long | _totalProcessingTime | boolean | _stopCalled | boolean | _suspended | private MBeanInfo | _MBeanInfo |
Constructors Summary |
---|
public Worker(Queue queue, int workFactor)put your documentation comment here
super();
_queue = queue;
_workFactor = workFactor;
// Attributes
OpenMBeanAttributeInfo[] attributeInfo = new OpenMBeanAttributeInfo[6];
attributeInfo[0] = new OpenMBeanAttributeInfoSupport(
"WorkFactor", // name
"The amount of work to do.", // description
SimpleType.INTEGER, // type
true, // isReadable?
false, // isWritable?
false // isIs?
);
attributeInfo[1] = new OpenMBeanAttributeInfoSupport(
"NumberOfUnitsProcessed", // name
"The number of units processed.", // description
SimpleType.LONG, // type
true, // isReadable?
false, // isWritable?
false // isIs?
);
attributeInfo[2] = new OpenMBeanAttributeInfoSupport(
"AverageUnitProcessingTime", // name
"Avg. no. milliseconds to process each work unit.", // description
SimpleType.FLOAT, // type
true, // isReadable?
false, // isWritable?
false // isIs?
);
attributeInfo[3] = new OpenMBeanAttributeInfoSupport(
"Suspended", // name
"Whether or not this thread is suspended.", // description
SimpleType.BOOLEAN, // type
true, // isReadable?
false, // isWritable?
true // isIs?
);
attributeInfo[4] = new OpenMBeanAttributeInfoSupport(
"TraceOn", // name
"Whether or not tracing is on.", // description
SimpleType.BOOLEAN, // type
true, // isReadable?
false, // isWritable?
true // isIs?
);
attributeInfo[5] = new OpenMBeanAttributeInfoSupport(
"NumberOfResets", // name
"The number of times this MBean has been reset.", // description
SimpleType.INTEGER, // type
true, // isReadable?
false, // isWritable?
false // isIs?
);
// Constructors
OpenMBeanConstructorInfo[] constructorInfo = new OpenMBeanConstructorInfo[1];
constructorInfo[0] = new OpenMBeanConstructorInfoSupport(
"Constructor",
"Constructs a Worker MBean.", // description
new OpenMBeanParameterInfoSupport[0]
);
// Operations
OpenMBeanOperationInfo[] operationInfo = new OpenMBeanOperationInfo[3];
operationInfo[0] = new OpenMBeanOperationInfoSupport(
"stop", // name
"Stops this Worker thread.", // description
new OpenMBeanParameterInfo[0], // signature
SimpleType.VOID, // return type
MBeanOperationInfo.ACTION // impact
);
operationInfo[1] = new OpenMBeanOperationInfoSupport(
"suspend", // name
"Suspends this Worker thread.", // description
new OpenMBeanParameterInfo[0], // signature
SimpleType.VOID, // return type
MBeanOperationInfo.ACTION // impact
);
operationInfo[2] = new OpenMBeanOperationInfoSupport(
"resume", // name
"Resumes this Worker thread.", // description
new OpenMBeanParameterInfo[0], // signature
SimpleType.VOID, // return type
MBeanOperationInfo.ACTION // impact
);
// Notifications - NONE
// MBeanInfo!
_MBeanInfo = new OpenMBeanInfoSupport(
this.getClass().getName(), // DynamicMBean implementing class name
"Worker Open MBean.", // description
attributeInfo, // MBeanAttributeInfo[]
constructorInfo, // MBeanConstructorInfo[]
operationInfo, // MBeanOperationInfo[]
null // MBeanNotificationInfo[]
);
|
Methods Summary |
---|
void | calculatePrimes(int numberOfPrimesToCalculate)In this method is where the "work" takes place. We need
a way to simulate the application doing something, so we
calculate the first workFactor primes, starting with zero.
So, the work factor is equal to the number of primes that
are calculated.
// There is probably an easier way to do this,
/// but it seemed a good way to chew up some CPU
long startTime = System.currentTimeMillis();
long number = 1;
int numberOfPrimesCalculated = 0;
while (numberOfPrimesCalculated < numberOfPrimesToCalculate) {
long currentNumber = 1; // start with 1
long numberOfFactors = 0;
while (currentNumber <= number) {
if ((number%currentNumber) == 0) {
// This is *definitely* the long way around, but
/// remember, we *want* to eat up lots of CPU...
numberOfFactors++;
}
currentNumber++;
}
// The number is prime if it only has two factors
/// (i.e., itself and 1)
if (numberOfFactors == 2) {
numberOfPrimesCalculated++;
// System.out.println("Supplier.calculatePrimes(): INFO: " +
// "Prime number found - " + number);
}
number++;
}
_totalProcessingTime += (System.currentTimeMillis() - startTime);
| public java.lang.Object | getAttribute(java.lang.String attributeName)Obtains the value of a specific attribute of the Dynamic MBean.
Object ret = null;
//
// Using exlicit superclass exposure as the means of
/// management interface inheritance.
//
if (attributeName.equals("WorkFactor")) {
ret = new Integer(getWorkFactor());
}
else if (attributeName.equals("NumberOfUnitsProcessed")) {
ret = new Long(getNumberOfUnitsProcessed());
}
else if (attributeName.equals("AverageUnitProcessingTime")) {
ret = new Float(getAverageUnitProcessingTime());
}
else if (attributeName.equals("Suspended")) {
ret = new Boolean(isSuspended());
}
else if (attributeName.equals("TraceOn")) {
ret = new Boolean(isTraceOn());
}
else if (attributeName.equals("NumberOfResets")) {
ret = new Integer(getNumberOfResets());
}
else
throw new AttributeNotFoundException("Worker.getAttribute(): ERROR: "
+ "Attribute \'" + attributeName + "\' not found.");
return ret;
| public javax.management.AttributeList | getAttributes(java.lang.String[] attributeNames)Enables the values of several attributes of the Dynamic MBean.
// no attributes...
AttributeList ret = new AttributeList();
return ret;
| public float | getAverageUnitProcessingTime()put your documentation comment here
return (_numberOfUnitsProcessed > 0) ? (float)_totalProcessingTime/(float)_numberOfUnitsProcessed :
0.0f;
| public javax.management.MBeanInfo | getMBeanInfo()Provides the exposed attributes and actions of the Dynamic MBean using an MBeanInfo object.
return (_MBeanInfo);
| public long | getNumberOfUnitsProcessed()put your documentation comment here
return _numberOfUnitsProcessed;
| public int | getWorkFactor()put your documentation comment here
return _workFactor;
| public java.lang.Object | invoke(java.lang.String operationName, java.lang.Object[] params, java.lang.String[] signature)Allows an action to be invoked on the Dynamic MBean.
Object ret = Void.TYPE;
//
// Turn the signature into a Class array so we can get the Method
/// object and invoke the method, passing params
//
try {
Class[] sign = new Class[signature.length];
for (int aa = 0; aa < signature.length; aa++) {
try {
sign[aa] = this.getClassFromString(signature[aa]);
} catch (ClassNotFoundException e) {
throw new RuntimeOperationsException(new IllegalArgumentException(
"Controller.invoke(): ERROR: " + "Bad argument \'"
+ sign[aa] + " found when attempting to invoke operation \'"
+ operationName + "\'!"));
}
}
Method theMethod = this.getClass().getMethod(operationName, sign);
//
// If we got this far, then the requested method is on the
/// Class, but is it on the management interface?
//
if (operationName.equals("stop") || operationName.equals("suspend")
|| operationName.equals("resume") || operationName.equals("reset")
|| operationName.equals("enableTracing") || operationName.equals("disableTracing")) {
theMethod.invoke(this, params);
}
else {
// delegate to parent class
throw new ReflectionException(new NoSuchMethodException("Worker.invoke(): ERROR: "
+ "Method \'" + operationName + "\' does not exist."));
}
} catch (NoSuchMethodException e) {
throw new ReflectionException(e, e.getClass().getName());
} catch (IllegalAccessException e) {
throw new ReflectionException(e, e.getClass().getName());
} catch (InvocationTargetException e) {
throw new ReflectionException(e, e.getClass().getName());
}
return ret;
| public boolean | isSuspended()put your documentation comment here
return _suspended;
| public void | reset()put your documentation comment here
setNumberOfUnitsProcessed(0);
setNumberOfResets(getNumberOfResets() + 1);
| public synchronized void | resume()put your documentation comment here
_suspended = false;
notifyAll();
| public abstract void | run()put your documentation comment here
| public void | setAttribute(javax.management.Attribute attribute)Sets the value of a specific attribute of the Dynamic MBean
//
// No writeable attributes on the management interface.
//
| public javax.management.AttributeList | setAttributes(javax.management.AttributeList attributes)Sets the values of several attributes of the Dynamic MBean
//
// No writeable attributes on the management interface...
//
AttributeList ret = new AttributeList();
return ret;
| public void | setNumberOfUnitsProcessed(long value)put your documentation comment here
_numberOfUnitsProcessed = value;
| public synchronized void | stop()put your documentation comment here
_stopCalled = true;
| public synchronized void | suspend()put your documentation comment here
_suspended = true;
|
|