升级到 OpenEJB 3.1.3 后,Tomcat/OpenEJB 启动时出现以下错误:
ERROR - Unable to register MBean
java.lang.IllegalStateException: javax.management.MalformedObjectNameException: Invalid character ',' in key part of property
at org.apache.openejb.monitoring.ObjectNameBuilder.build(ObjectNameBuilder.java:59)
at org.apache.openejb.core.mdb.MdbContainer.deploy(MdbContainer.java:169)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:599)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:450)
at org.apache.openejb.assembler.classic.Assembler.buildContainerSystem(Assembler.java:368)
at org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:280)
at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:125)
at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:60)
at org.apache.openejb.OpenEJB.init(OpenEJB.java:271)
at org.apache.openejb.OpenEJB.init(OpenEJB.java:250)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.openejb.loader.OpenEJBInstance.init(OpenEJBInstance.java:36)
at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:71)
at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:53)
at org.apache.openejb.client.LocalInitialContextFactory.getInitialContext(LocalInitialContextFactory.java:42)
...
<proprietary stack trace skipped>
...
Caused by: javax.management.MalformedObjectNameException: Invalid character ',' in key part of property
at javax.management.ObjectName.construct(ObjectName.java:535)
at javax.management.ObjectName.<init>(ObjectName.java:1403)
at org.apache.openejb.monitoring.ObjectNameBuilder.build(ObjectNameBuilder.java:57)
... 70 more
INFO - Created Ejb(deployment-id=InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT, ejb-name=InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT, container=My MDB Container )
以下 MDB 导致此错误:
@MessageDriven(name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")
public class InboundXMLQueueHandler implements MessageListener {
...
因为改成之后
@MessageDriven(name="InboundXMLQueueHandlerST")
public class InboundXMLQueueHandler implements MessageListener {
...
错误消失了。
如您所见,我们在注释中使用单个类和逗号分隔的队列名称定义了两个侦听器。这在 3.1.2 中完美运行(至少看起来如此),但现在它给了我们上面的错误(虽然该错误似乎并没有阻止 MDB 的部署,但 JMX 监控对我们来说至关重要)。
我也找不到任何@MessageDriven
具有多个队列(单个 MDB 类、多个逗号分隔的队列名称)的使用注释示例。这是错误的做法吗?它是记录在案的功能吗?3.1.3 中发生了什么变化使 JMX 不能再注册 MDB?