下面的错误在Tomcat的/ OpenEJB的启动出现升级后OpenEJB的3.1.3:

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完美地工作(至少它似乎),但现在它为我们提供了上述错误(虽然似乎是错误不会阻止多边开发银行的部署,但JMX监控是至关重要的美国)。

我无法找到与多个队列(单MDB类,逗号隔开的多个队列名称)再或者使用@MessageDriven注释的任何例子。这是一种错误的方式做到这一点?它是一个记录的功能?什么在3.1.3更改,以便JMX不能注册MDB了?

有帮助吗?

解决方案

嗯,我们没有在3.1.2 JMX支持。我个人从来没有试图钩住MDB最多两个队列 - 有点惊讶的是工作。这是ActiveMQ的,做实际的“队列挂钩”(即JMS连接器的标准工作),我们只是通过元数据结束了。

在OpenEJB的一面,这只神奇的,我们要做的就是通过destination尝试在你的destinationType@ActivationConfigProperty设置填充,如果你还没有这样做。如果没有填写,我们将设置destinationdestinationType如果没有填写,我们将设置javax.jms.Queue到你的bean的名字。

所以你的bean上方将基本上是这样的,如果所有被明确设置。

@MessageDriven(
    name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT",
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destinationType", 
           propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...

假设ActiveMQ的实际上是给你两个队列,这是activationConfig会做到这一点。

也许尝试最简单的做法是明确地设定目的地的名称,只是删除了bean的名字。

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top