有人知道如何将自定义 MBean 部署到 Tomcat 吗?
到目前为止我发现了这一点http://www.junlu.com/list/3/8871.html。我将我的 jar 和 MBean 复制到 Tomcat lib 目录,以便自定义类加载器能够拾取它。然后我按照说明操作,但一直收到以下异常。我的 MBean 确实有一个公共构造函数。如果我从 tomcat lib 目录中删除 jar,我会收到相同的消息,这表明它没有拾取我的 jar,或者我的 jar 是在 Apache MBean Modeler 在 Tomcat 中运行后加载的。
2010 年 8 月 6 日 12:14:23 org.apache.tomcat.util.modeler.modules.MbeansSource 执行严重:创建 mbean 时出错 Bean:type=Bean javax.management.NotCompliantMBeanException:MBean 类必须具有公共构造函数,位于 com.sun.jmx.mbeanserver.Introspector.testCreation(Introspector.java:127),位于 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.createMBean(DefaultMBeanServerInterceptor.java:2,位于 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.createMBean(DefaultMBeanServerInterceptor.java:1,位于 com.sun.jmx.mbeanserver.JmxMBeanServer.createMBean(JmxMBeanServer.java:393),位于org.apache.tomcat.util.modeler.modules.MbeansSource.execute(MbeansSource.java:207) at org.apache.tomcat.util.modeler.modules.MbeansSource.load(MbeansSource.java:137) at org.apache.catalina.core.StandardEngine.readEngineMbeans(StandardEngine.java:517) at org.apache.catalina.core.StandardEngine.init(StandardEngine.java:321) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:411) at org.apache.catalina.core.StandardService.start(StandardService.java:519) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:581) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
答案1
在我的测试中,当类名和 mbeans-descriptors.xml 文件中的名称属性不匹配时,就会出现此消息。
<mbeans-descriptors>
<mbean name="<your class name here>"
...
看起来 tomcat 正在通过 name 属性搜索构造函数。
答案2
Tomcat MBean 支持基于Apache Commons Modeler,它还定义了 XML 描述符的格式。请参阅此主题获得更多指示。
答案3
我不确定 JMX 规范是否要求这样做,但如果您的实现类名为 Foo,则必须将您的接口命名为 FooMBean。如果不这样做,您将在部署时收到一条异常,指出:MBean 不合规。这非常重要!!!