jcarman 2005/05/05 05:44:22
Modified: jmx/src/documentation/resources/images
jConsoleLoggerMBean.png loggerView.png
jConsoleConnectLocal.png loggerMBeansView.png
jmx/src/java/org/apache/hivemind/management/impl
ObjectNameBuilderImpl.java ObjectNameEditor.java
jmx/src/test/org/apache/hivemind/management
TestPerformanceMonitorFactory.java
testMBeanRegistry.xml TestMBeanRegistry.java
jmx/src/documentation/content/xdocs/hivemind-jmx
setupMBeanServer.xml quickstart.xml
setupConnectors.xml setupJMXImplementation.xml
measurePerformance.xml monitorServices.xml
manageLog4j.xml multipleApps.xml
jmx/src/java/org/apache/hivemind/management/mbeans
PerformanceMonitorMBean.java
. status.xml
Added: jmx/src/documentation/resources/images
performanceInterceptorMBean.png
jmx/src/test/org/apache/hivemind/management/mbeans
ConcreteMBean.java TestAbstractDynamicMBean.java
jmx/src/test/org/apache/hivemind/management/impl
TestObjectNameEditor.java
jmx/src/java/org/apache/hivemind/management/mbeans
AbstractDynamicMBean.java
Log:
JMX Enhancements
PR: HIVEMIND-107
Submitted by: Achim H�gen
Revision Changes Path
1.2 +66 -151
jakarta-hivemind/jmx/src/documentation/resources/images/jConsoleLoggerMBean.png
<<Binary file>>
1.2 +39 -118
jakarta-hivemind/jmx/src/documentation/resources/images/loggerView.png
<<Binary file>>
1.2 +48 -79
jakarta-hivemind/jmx/src/documentation/resources/images/jConsoleConnectLocal.png
<<Binary file>>
1.2 +59 -82
jakarta-hivemind/jmx/src/documentation/resources/images/loggerMBeansView.png
<<Binary file>>
1.1
jakarta-hivemind/jmx/src/documentation/resources/images/performanceInterceptorMBean.png
<<Binary file>>
1.3 +1 -1
jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/impl/ObjectNameBuilderImpl.java
Index: ObjectNameBuilderImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/impl/ObjectNameBuilderImpl.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ObjectNameBuilderImpl.java 29 Apr 2005 07:40:53 -0000 1.2
+++ ObjectNameBuilderImpl.java 5 May 2005 12:44:21 -0000 1.3
@@ -58,7 +58,7 @@
ObjectName objectName;
try
{
- objectName = ObjectName.getInstance(name);
+ objectName = new ObjectName(name);
}
catch (MalformedObjectNameException e)
{
1.2 +1 -1
jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/impl/ObjectNameEditor.java
Index: ObjectNameEditor.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/impl/ObjectNameEditor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ObjectNameEditor.java 16 Apr 2005 14:41:38 -0000 1.1
+++ ObjectNameEditor.java 5 May 2005 12:44:21 -0000 1.2
@@ -20,7 +20,7 @@
import javax.management.ObjectName;
/**
- * PropertyEditor for JMX ObjectNames Converts strings to ObjectNames
+ * PropertyEditor for JMX ObjectNames. Converts strings to ObjectNames
*
* @author Achim Huegen
* @since 1.1
1.2 +3 -3
jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/TestPerformanceMonitorFactory.java
Index: TestPerformanceMonitorFactory.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/TestPerformanceMonitorFactory.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TestPerformanceMonitorFactory.java 16 Apr 2005 14:41:38 -0000
1.1
+++ TestPerformanceMonitorFactory.java 5 May 2005 12:44:21 -0000
1.2
@@ -42,13 +42,13 @@
// Look for the mbean that collects the performance data
MBeanServer mbeanServer = (MBeanServer)
registry.getService(MBeanServer.class);
-
- registry.getService(ObjectNameBuilder.class);
-
ObjectName objectName = new ObjectName(
"hivemind:module=test.management,type=service,id=Calculator,decorator=PerformanceCollector");
ObjectInstance instance = mbeanServer.getObjectInstance(objectName);
assertNotNull(instance);
+ // Execute some operations for code coverage
+ calculator.add(123);
}
+
}
\ No newline at end of file
1.2 +5 -1
jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/testMBeanRegistry.xml
Index: testMBeanRegistry.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/testMBeanRegistry.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- testMBeanRegistry.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ testMBeanRegistry.xml 5 May 2005 12:44:21 -0000 1.2
@@ -21,9 +21,13 @@
<create-instance class="MBeanTestService" model="primitive" />
</service-point>
+ <service-point id="MBean2" interface="java.lang.Runnable">
+ <create-instance class="MBeanTestService" model="primitive" />
+ </service-point>
+
<contribution configuration-id="hivemind.management.MBeans">
<mbean service-id="MBean1" start-method="start" />
- <mbean service-id="MBean1" object-name="hivemind:name=bean1" />
+ <mbean service-id="MBean2" object-name="hivemind:name=bean2" />
</contribution>
</module>
1.3 +73 -8
jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/TestMBeanRegistry.java
Index: TestMBeanRegistry.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/TestMBeanRegistry.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestMBeanRegistry.java 29 Apr 2005 01:47:33 -0000 1.2
+++ TestMBeanRegistry.java 5 May 2005 12:44:21 -0000 1.3
@@ -16,6 +16,7 @@
import java.util.List;
+import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectInstance;
@@ -26,6 +27,11 @@
import org.apache.commons.logging.LogFactory;
import org.apache.hivemind.ErrorHandler;
import org.apache.hivemind.Registry;
+import org.apache.hivemind.events.RegistryShutdownListener;
+import org.apache.hivemind.impl.DefaultClassResolver;
+import org.apache.hivemind.impl.DefaultErrorHandler;
+import org.apache.hivemind.impl.ModuleImpl;
+import org.apache.hivemind.internal.Module;
import org.apache.hivemind.internal.ServicePoint;
import org.apache.hivemind.management.impl.MBeanRegistrationContribution;
import org.apache.hivemind.management.impl.MBeanRegistryImpl;
@@ -33,6 +39,7 @@
import org.apache.hivemind.test.HiveMindTestCase;
import org.easymock.ArgumentsMatcher;
import org.easymock.MockControl;
+import org.easymock.internal.AlwaysMatcher;
import org.easymock.internal.EqualsMatcher;
/**
@@ -45,6 +52,8 @@
{
private ErrorHandler errorHandler;
+ private MockControl logControl;
+
private Log log;
private MockControl serverControl;
@@ -55,7 +64,8 @@
public void setUp()
{
- errorHandler = (ErrorHandler) newMock(ErrorHandler.class);
+ errorHandler = new DefaultErrorHandler();
+ logControl = (MockControl) newControl(Log.class);
log = LogFactory.getLog(MBeanRegistry.class);
serverControl = newControl(MBeanServer.class);
server = (MBeanServer) serverControl.getMock();
@@ -75,15 +85,29 @@
Object mBean1 = registry.getService("test.management.MBean1",
Runnable.class);
ObjectName on1 = objectNameBuilder.createServiceObjectName(sp1);
server.registerMBean(mBean1, on1);
- serverControl.setReturnValue(new ObjectInstance(on1,
mBean1.getClass().getName()));
+ ObjectInstance oin1 = new ObjectInstance(on1,
mBean1.getClass().getName());
+ serverControl.setReturnValue(oin1);
+
+ Object mBean2 = registry.getService("test.management.MBean2",
Runnable.class);
+ ObjectName on2 = new ObjectName("hivemind:name=bean2");
+ server.registerMBean(mBean2, on2);
+ serverControl.setReturnValue(new ObjectInstance(on2,
mBean2.getClass().getName()));
+
+ // Call from unregisterBean
+ server.getObjectInstance(on1);
+ serverControl.setReturnValue(oin1);
- ObjectName on2 = new ObjectName("hivemind:name=bean1");
- server.registerMBean(mBean1, on2);
- serverControl.setReturnValue(new ObjectInstance(on1,
mBean1.getClass().getName()));
+ server.unregisterMBean(on1);
+ server.unregisterMBean(on2);
replayControls();
- new MBeanRegistryImpl(errorHandler, log, server, objectNameBuilder,
mBeanList);
+ MBeanRegistry mbeanRegistry = new MBeanRegistryImpl(errorHandler,
log, server,
+ objectNameBuilder, mBeanList);
+
+ // Unregister one bean manually the other one during registry
shutdown
+ mbeanRegistry.unregisterMBean(on1);
+ ((RegistryShutdownListener) mbeanRegistry).registryDidShutdown();
verifyControls();
@@ -122,6 +146,36 @@
}
/**
+ * Tests the handling of registrations errors during processing of the
contributed mbeans
+ */
+ public void testRegistrationException() throws Exception
+ {
+ Registry registry = buildFrameworkRegistry("testMBeanRegistry.xml");
+ List mBeanList =
registry.getConfiguration("hivemind.management.MBeans");
+
+ ServicePoint sp1 = ((MBeanRegistrationContribution)
mBeanList.get(0)).getServicePoint();
+ ObjectName on1 = objectNameBuilder.createServiceObjectName(sp1);
+
+ // Training
+ server.registerMBean(null, null);
+ serverControl.setThrowable(new MBeanRegistrationException(new
Exception(
+ "Registration failed")));
+ serverControl.setDefaultMatcher(new AlwaysMatcher());
+ server.registerMBean(null, null);
+ serverControl.setThrowable(new MBeanRegistrationException(new
Exception(
+ "Registration failed")));
+
+ replayControls();
+
+ interceptLogging(MBeanRegistry.class.getName());
+
+ MBeanRegistry mbeanRegistry = new MBeanRegistryImpl(errorHandler,
log, server,
+ objectNameBuilder, mBeanList);
+
+ assertLoggedMessage("Registering MBean " + on1.toString() + "
failed");
+ }
+
+ /**
* Ensures that a bean with management interface is registered as
StandardMBean
*/
public void testStandardMBean() throws Exception
@@ -148,8 +202,8 @@
EqualsMatcher matcher = new EqualsMatcher();
return matcher.matches(arg0, arg1);
}
-
- return arg1[0].getClass().equals(StandardMBean.class);
+ else
+ return arg1[0].getClass().equals(StandardMBean.class);
}
public String toString(Object[] arg0)
@@ -169,4 +223,15 @@
verifyControls();
}
+
+ private Module newModule()
+ {
+ ModuleImpl result = new ModuleImpl();
+
+ result.setClassResolver(new DefaultClassResolver());
+ result.setPackageName("");
+
+ return result;
+ }
+
}
\ No newline at end of file
1.1
jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/mbeans/ConcreteMBean.java
Index: ConcreteMBean.java
===================================================================
//Copyright 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.hivemind.management.mbeans;
import javax.management.Attribute;
import javax.management.AttributeNotFoundException;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.ReflectionException;
/**
* Test MBean
*
* @author Achim Huegen
*/
public class ConcreteMBean extends AbstractDynamicMBean
{
private String attribute1 = "value1";
private String attribute2 = "value2";
public boolean isSetAttribute1Called;
public boolean isSetAttribute2Called;
public ConcreteMBean()
{
}
protected MBeanAttributeInfo[] createMBeanAttributeInfo()
{
MBeanAttributeInfo att1 = new MBeanAttributeInfo("attribute1",
"String", "", true,
true, false);
MBeanAttributeInfo att2 = new MBeanAttributeInfo("attribute2",
"String", "", true,
true, false);
return new MBeanAttributeInfo[]
{ att1, att2 };
}
protected MBeanConstructorInfo[] createMBeanConstructorInfo()
{
MBeanConstructorInfo constructor = new
MBeanConstructorInfo("constructor", "",
new MBeanParameterInfo[] {});
return new MBeanConstructorInfo[]
{ constructor };
}
protected MBeanNotificationInfo[] createMBeanNotificationInfo()
{
MBeanNotificationInfo notification = new MBeanNotificationInfo(new
String[0],
"notification", "");
return new MBeanNotificationInfo[]
{ notification };
}
protected MBeanOperationInfo[] createMBeanOperationInfo()
{
MBeanOperationInfo operation = new MBeanOperationInfo("operation", "",
new MBeanParameterInfo[0], "String", 0);
return new MBeanOperationInfo[]
{ operation };
}
public Object getAttribute(String name) throws
AttributeNotFoundException, MBeanException,
ReflectionException
{
if (name.equals("attribute1"))
return attribute1;
if (name.equals("attribute2"))
return attribute2;
throw new AttributeNotFoundException();
}
public void setAttribute(Attribute attribute) throws
AttributeNotFoundException,
InvalidAttributeValueException, MBeanException,
ReflectionException
{
if (attribute.getName().equals("attribute1"))
attribute1 = (String) attribute.getValue();
if (attribute.getName().equals("attribute2"))
attribute2 = (String) attribute.getValue();
throw new AttributeNotFoundException();
}
}
1.1
jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/mbeans/TestAbstractDynamicMBean.java
Index: TestAbstractDynamicMBean.java
===================================================================
//Copyright 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.hivemind.management.mbeans;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.MBeanInfo;
import junit.framework.TestCase;
/**
* Test of [EMAIL PROTECTED]
org.apache.hivemind.management.mbeans.AbstractDynamicMBean}
*
* @author Achim Huegen
*/
public class TestAbstractDynamicMBean extends TestCase
{
public void testMBeanInfo()
{
ConcreteMBean mbean = new ConcreteMBean();
MBeanInfo beanInfo = mbean.getMBeanInfo();
assertEquals(2, beanInfo.getAttributes().length);
assertEquals("attribute1", beanInfo.getAttributes()[0].getName());
assertEquals("attribute2", beanInfo.getAttributes()[1].getName());
assertEquals("constructor", beanInfo.getConstructors()[0].getName());
assertEquals("notification",
beanInfo.getNotifications()[0].getName());
assertEquals("operation", beanInfo.getOperations()[0].getName());
}
public void testGetAttributes() throws Exception
{
ConcreteMBean mbean = new ConcreteMBean();
AttributeList list = mbean.getAttributes(new String[]
{ "attribute1", "attribute2" });
assertEquals("value1", ((Attribute) list.get(0)).getValue());
assertEquals("value2", ((Attribute) list.get(1)).getValue());
}
public void testSetAttributes() throws Exception
{
ConcreteMBean mbean = new ConcreteMBean();
AttributeList list = new AttributeList();
list.add(new Attribute("attribute1", "newvalue1"));
list.add(new Attribute("attribute2", "newvalue2"));
mbean.setAttributes(list);
assertEquals("newvalue1", mbean.getAttribute("attribute1"));
assertEquals("newvalue2", mbean.getAttribute("attribute2"));
}
}
1.2 +10 -4
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/setupMBeanServer.xml
Index: setupMBeanServer.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/setupMBeanServer.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- setupMBeanServer.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ setupMBeanServer.xml 5 May 2005 12:44:21 -0000 1.2
@@ -29,10 +29,16 @@
<p>
A running MBean Server is needed in your application. It is
the central registry for all MBeans of your application.
- Fortunately, since JMX 1.2 there is a standardized factory for finding
running
- servers and starting new ones. HiveMind first tries to find a running
- server. That could be provided by an application server or servlet
+ The JMX specification requires a JMX implementation to provide
+ a factory (javax.management.MBeanServerFactory) for finding running
+ servers and starting new ones.
+ </p>
+ <p>HiveMind uses MBeanServerFactory to find a running server at first.
+ That one could be provided by an application server or servlet
engine (like Tomcat 5) or your J2SE 1.5 runtime environment.
+ If multiple implementations are available in your environment
+ the classpath and classloader hierarchy finally decide which
+ implementation is used.
Add these lines to your module descriptor:
</p>
<source><![CDATA[
@@ -47,4 +53,4 @@
If no running server is found, a new one is started.
</p>
</body>
-</document>
+</document>
\ No newline at end of file
1.2 +1 -1
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/quickstart.xml
Index: quickstart.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/quickstart.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- quickstart.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ quickstart.xml 5 May 2005 12:44:21 -0000 1.2
@@ -117,4 +117,4 @@
for one of your services or just make a service manageable.</p>
</section>
</body>
-</document>
+</document>
\ No newline at end of file
1.2 +2 -2
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/setupConnectors.xml
Index: setupConnectors.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/setupConnectors.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- setupConnectors.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ setupConnectors.xml 5 May 2005 12:44:21 -0000 1.2
@@ -104,7 +104,7 @@
<p>Now you can connect to the application with
jconsole or MC4J
using this url:
service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmx .
</p>
- <p>NYou can change RMI port and the service url
this way:
+ <p>You can change RMI port and the service url
this way:
</p>
<source><![CDATA[
<contribution configuration-id="hivemind.ApplicationDefaults">
@@ -123,4 +123,4 @@
java -Dcom.sun.management.jmxremote ...]]></source>
</section>
</body>
-</document>
+</document>
\ No newline at end of file
1.2 +2 -8
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/setupJMXImplementation.xml
Index: setupJMXImplementation.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/setupJMXImplementation.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- setupJMXImplementation.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ setupJMXImplementation.xml 5 May 2005 12:44:21 -0000 1.2
@@ -31,11 +31,8 @@
<p>HiveMind uses <link href="http://mx4j.sourceforge.net" >MX4J</link>
for development and testing, but it can run with any
other JMX 1.2
implementation. HiveMind has additionally been tested
with
- the Sun Reference Implementation and J2SE 1.5.
+ J2SE 1.5 and the Sun Reference Implementation of JMX.
</p>
- <note>Since HiveMind MBeans use MX4J AbstractDynamicMBean as
ancestor
- the mx4j.jar from the MX4J library is
<strong>always</strong> needed in your classpath. <br/>
- </note>
<section>
<title>MX4J</title>
<p>Get MX4J <link href="http://mx4j.sourceforge.net"
>here</link>
@@ -47,8 +44,7 @@
<section>
<title>J2SE 1.5</title>
<p>If your application runs with Sun J2SE 1.5 no
additional libraries are needed
- (besides mx4j.jar, see note above). This can
change later if you
- decide to use HTTP to manage your application.
+ This can change later if you decide to use HTTP
to manage your application.
</p>
</section>
<section>
@@ -57,8 +53,6 @@
in version 1.2.1
</p>
<p>Add jmxri.jar and jmxtools.jar to the classpath.
- Add mx4j.jar to your classpath (see note above)
and ensure
- that it's behind the SUN jars.
</p>
</section>
</body>
1.2 +8 -2
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/measurePerformance.xml
Index: measurePerformance.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/measurePerformance.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- measurePerformance.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ measurePerformance.xml 5 May 2005 12:44:21 -0000 1.2
@@ -33,7 +33,8 @@
Add the Interceptor to your service and choose which methods
are to be intercepted by inclusion and exclusion:</p>
<source><![CDATA[
-<service-point id="Calculator"
interface="org.apache.hivemind.management.Calculator">
+<service-point id="Calculator"
+ interface="org.apache.hivemind.management.Calculator">
<invoke-factory>
<construct class="org.apache.hivemind.management.CalculatorImpl" />
</invoke-factory>
@@ -48,5 +49,10 @@
with an additional name part
"decorator=PerformanceCollector":<br/><br/>
<img src="images/performanceInterceptorMBean.png"
alt="Performance Interceptor MBean"></img>
</p>
+ <note>
+ By default a service - and thus it's interceptors - is created
+ on the first call of a service method. If you want to get the
+ performance mbean at startup, add your service to the EagerLoad
contribution.
+ </note>
</body>
-</document>
+</document>
\ No newline at end of file
1.2 +25 -2
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/monitorServices.xml
Index: monitorServices.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/monitorServices.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- monitorServices.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ monitorServices.xml 5 May 2005 12:44:21 -0000 1.2
@@ -26,6 +26,29 @@
<title>Monitor services</title>
</header>
<body>
- <p> Documentation coming soon. </p>
+ <p>
+ Though creation of jmx monitors is not automated a monitor can
+ easily defining as service point using the standard BuilderFactory
+ functionality. Such a monitor can watch the attribute of another
+ MBean (for example the average execution time of a service method
+ when using an <link href="site:use.MeasurePerformance">Performance
Interceptor</link>
+ and send notifications, if a treshold is crossed.
+ </p>
+ <source><![CDATA[
+<service-point id="CalculatorSumMonitor"
+ interface="javax.management.monitor.GaugeMonitorMBean">
+ <invoke-factory model="primitive" >
+
+ <construct class="javax.management.monitor.GaugeMonitor" >
+ <set property="granularityPeriod" value="1000" />
+ <set property="observedObject"
+ value="HiveMind:module=test.management,type=service,
+ id=Calculator,decorator=PerformanceCollector" />
+ <set property="observedAttribute"
+ value="add(int) : Average Time" />
+ </construct>
+
+ </invoke-factory>
+</service-point>]]></source>
</body>
-</document>
+</document>
\ No newline at end of file
1.2 +32 -3
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/manageLog4j.xml
Index: manageLog4j.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/manageLog4j.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- manageLog4j.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ manageLog4j.xml 5 May 2005 12:44:21 -0000 1.2
@@ -26,7 +26,36 @@
<title>Manage Log4J loggers via JMX</title>
</header>
<body>
-
- <p> Documentation coming soon. </p>
+ <p>HiveMind JMX includes support for the management of Log4J.
+ HiveMind uses the basic MBeans already provided by Log4J
+ and adds configurable and dynamic registration of new loggers
+ for management.
+ The MBeans can be used to change log levels, add new
+ appenders and set log thresholds.
+ </p>
+ <p>
+ Add these lines to your descriptor to activate the
+ Log4j management and create MBeans for all loggers named
+ "hivemind.*" (* is a wildcard ).
+ </p>
+ <source><![CDATA[
+<contribution configuration-id="hivemind.management.MBeans">
+ <mbean service-id="hivemind.management.log4j.LogManagementMBean" />
+</contribution>
+
+<contribution
+ configuration-id="hivemind.management.log4j.ManagedLog4jLoggers">
+
+ <logger name="hivemind.*" />
+</contribution>
+]]></source>
+ <note>
+ At startup HiveMind searches for known loggers that match the
+ configured name patterns. It's quite likeley, that some
+ of the loggers that should be managed doesn't exist in this
+ early phase, since usually loggers are create when a class gets
loaded.
+ If loggers are missing try to add them using the addLoggerMBean
+ method of the LogManagementMBean on runtime.
+ </note>
</body>
-</document>
+</document>
\ No newline at end of file
1.2 +21 -2
jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/multipleApps.xml
Index: multipleApps.xml
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/documentation/content/xdocs/hivemind-jmx/multipleApps.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- multipleApps.xml 16 Apr 2005 14:41:38 -0000 1.1
+++ multipleApps.xml 5 May 2005 12:44:21 -0000 1.2
@@ -26,6 +26,25 @@
<title>Multiple applications in one MBeanServer</title>
</header>
<body>
- <p> Documentation coming soon. </p>
+ <p>
+ If you want to run multiple HiveMind applications which
+ use JMX in a single JVM or application server, then there is
+ a chance of getting naming collisions.
+ </p>
+ <p>
+ By default HiveMind prepends "HiveMind:" as domain name to
+ the names of all MBeans. For example the service
+ "test.management.Calculator" gets registered using the
+ ObjectName
"hivemind:module=test.management,type=service,id=Calculator".
+ </p>
+ <p>
+ If multiple applications export the same service you
+ should must choose unique domain names for each application.
+ The domain name is configured as ApplicationSymbol:
+ </p>
+ <source><![CDATA[
+<contribution configuration-id="hivemind.ApplicationDefaults">
+ <default symbol="management.naming.domain" value="myDomain" />
+</contribution>]]></source>
</body>
-</document>
+</document>
\ No newline at end of file
1.1
jakarta-hivemind/jmx/src/test/org/apache/hivemind/management/impl/TestObjectNameEditor.java
Index: TestObjectNameEditor.java
===================================================================
//Copyright 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.hivemind.management.impl;
import javax.management.ObjectName;
import junit.framework.TestCase;
/**
* Test of [EMAIL PROTECTED]
org.apache.hivemind.management.impl.ObjectNameEditor}
*
* @author Achim Huegen
*/
public class TestObjectNameEditor extends TestCase
{
public void testSetAsText()
{
ObjectNameEditor editor = new ObjectNameEditor();
editor.setAsText("Hivemind:name=test");
ObjectName objectName = (ObjectName) editor.getValue();
assertEquals("Hivemind:name=test", objectName.toString());
}
public void testMalformed()
{
ObjectNameEditor editor = new ObjectNameEditor();
try
{
editor.setAsText("Hivemind=test:fail");
fail();
}
catch (IllegalArgumentException ignore)
{
}
}
public void testGetAsText() throws Exception
{
ObjectNameEditor editor = new ObjectNameEditor();
editor.setValue(new ObjectName("Hivemind:name=test"));
assertEquals("Hivemind:name=test", editor.getAsText());
}
}
1.3 +0 -2
jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/mbeans/PerformanceMonitorMBean.java
Index: PerformanceMonitorMBean.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/mbeans/PerformanceMonitorMBean.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PerformanceMonitorMBean.java 29 Apr 2005 07:40:56 -0000 1.2
+++ PerformanceMonitorMBean.java 5 May 2005 12:44:22 -0000 1.3
@@ -26,8 +26,6 @@
import javax.management.MBeanException;
import javax.management.ReflectionException;
-import mx4j.AbstractDynamicMBean;
-
import org.apache.hivemind.management.impl.PerformanceCollector;
import org.apache.hivemind.service.MethodSignature;
1.1
jakarta-hivemind/jmx/src/java/org/apache/hivemind/management/mbeans/AbstractDynamicMBean.java
Index: AbstractDynamicMBean.java
===================================================================
//Copyright 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.hivemind.management.mbeans;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.ReflectionException;
/**
* Ancestor for MBeans. Eases implementation of the [EMAIL PROTECTED]
javax.management.DynamicMBean} interface.
* Provides empty method implementations and implements [EMAIL PROTECTED]
#getAttributes(String[])} and
* [EMAIL PROTECTED] #setAttributes(AttributeList)}
*
* @author Achim Huegen
*/
public abstract class AbstractDynamicMBean implements DynamicMBean
{
private MBeanInfo _mBeanInfo;
/**
* @see javax.management.DynamicMBean#getMBeanInfo()
*/
public MBeanInfo getMBeanInfo()
{
if (_mBeanInfo == null)
setMBeanInfo(createMBeanInfo());
return _mBeanInfo;
}
/**
* Sets the MBeanInfo
*
* @param info
* the info
*/
protected void setMBeanInfo(MBeanInfo info)
{
_mBeanInfo = info;
}
/**
* Delegates the MBeanInfo retrieval to various methods
*
* @return the MBeanInfo of the MBean
*/
private MBeanInfo createMBeanInfo()
{
MBeanAttributeInfo attrs[] = createMBeanAttributeInfo();
MBeanConstructorInfo ctors[] = createMBeanConstructorInfo();
MBeanOperationInfo opers[] = createMBeanOperationInfo();
MBeanNotificationInfo notifs[] = createMBeanNotificationInfo();
String className = getMBeanClassName();
String description = getMBeanDescription();
return new MBeanInfo(className, description, attrs, ctors, opers,
notifs);
}
/**
* Provides the info which attributes the MBean has. Should be
overwritten by the descendants
*/
protected MBeanAttributeInfo[] createMBeanAttributeInfo()
{
return null;
}
/**
* Provides the info which constructors MBean has. Should be overwritten
by the descendants
*/
protected MBeanConstructorInfo[] createMBeanConstructorInfo()
{
return null;
}
/**
* Provides the info which operations can be called on the MBean. Should
be overwritten by the
* descendants
*/
protected MBeanOperationInfo[] createMBeanOperationInfo()
{
return null;
}
/**
* Provides the info which notifications the MBean supports. Should be
overwritten by the
* descendants
*/
protected MBeanNotificationInfo[] createMBeanNotificationInfo()
{
return null;
}
protected String getMBeanClassName()
{
return getClass().getName();
}
/**
* @return Textual description of the MBean
*/
protected String getMBeanDescription()
{
return null;
}
/**
* @see javax.management.DynamicMBean#getAttribute(java.lang.String)
*/
public Object getAttribute(String name) throws
AttributeNotFoundException, MBeanException,
ReflectionException
{
return null;
}
/**
* @see
javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
*/
public void setAttribute(Attribute attribute) throws
AttributeNotFoundException,
InvalidAttributeValueException, MBeanException,
ReflectionException
{
}
/**
* Gets a list of attributes using [EMAIL PROTECTED]
#getAttribute(String)}
*
* @see javax.management.DynamicMBean#getAttributes(java.lang.String[])
*/
public AttributeList getAttributes(String[] attributes)
{
AttributeList list = new AttributeList();
if (attributes != null)
{
for (int i = 0; i < attributes.length; i++)
{
String attribute = attributes[i];
try
{
Object result = getAttribute(attribute);
list.add(new Attribute(attribute, result));
}
catch (AttributeNotFoundException ignored)
{
}
catch (MBeanException ignored)
{
}
catch (ReflectionException ignored)
{
}
}
}
return list;
}
/**
* @see
javax.management.DynamicMBean#setAttributes(javax.management.AttributeList)
*/
public AttributeList setAttributes(AttributeList attributes)
{
AttributeList list = new AttributeList();
if (attributes != null)
{
for (int i = 0; i < attributes.size(); ++i)
{
Attribute attribute = (Attribute) attributes.get(i);
try
{
setAttribute(attribute);
list.add(attribute);
}
catch (AttributeNotFoundException ignored)
{
}
catch (InvalidAttributeValueException ignored)
{
}
catch (MBeanException ignored)
{
}
catch (ReflectionException ignored)
{
}
}
}
return list;
}
/**
* @see javax.management.DynamicMBean#invoke(java.lang.String,
java.lang.Object[],
* java.lang.String[])
*/
public Object invoke(String method, Object[] arguments, String[] params)
throws MBeanException,
ReflectionException
{
return null;
}
}
1.135 +1 -0 jakarta-hivemind/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-hivemind/status.xml,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -r1.134 -r1.135
--- status.xml 4 May 2005 15:17:45 -0000 1.134
+++ status.xml 5 May 2005 12:44:22 -0000 1.135
@@ -31,6 +31,7 @@
</todo>
<changes>
<release version="1.1-beta-2" date="unreleased">
+ <action type="add" dev="JC" due-to="Achim Hügen"
fixes-bug="HIVEMIND-107">JMX Enhancements </action>
<action type="fix" dev="JC" fixes-bug="HIVEMIND-73" >BuilderFactory
attempts to autowire java.util.List.</action>
<action type="fix" dev="JC" fixes-bug="HIVEMIND-78" >Certain
classloaders (AntClassLoader for example) cause NullPointerException in
impl.MessageFormatter.</action>
<action type="add" dev="JC" fixes-bug="HIVEMIND-91" >Add
getModuleMessages() to Registry.</action>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]