2

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 {
...

エラーはなくなりました。

ご覧のとおり、アノテーションで単一のクラスとコンマ区切りのキュー名を使用して2つのリスナーを定義しています。これは3.1.2で問題なく機能しましたが(少なくともそう見えました)、上記のエラーが発生します(ただし、エラーによってMDBの展開が妨げられることはないようですが、JMXモニタリングは重要です)。

@MessageDriven複数のキュー(単一のMDBクラス、複数のコンマ区切りのキュー名)を使用した使用法アノテーションの例も見つかりません。これは間違った方法ですか?文書化された機能ですか?JMXがMDBを登録できなくなるように、3.1.3で何が変更されましたか?

4

1 に答える 1

1

うーん、3.1.2ではJMXをサポートしていませんでした。私は個人的にMDBを2つのキューに接続しようとしたことはありません。実際の「キューへの接続」(JMSコネクタの標準ジョブ)を実行するのはActiveMQであり、メタデータを渡すだけです。

OpenEJB側では、私たちが行う唯一の魔法は、あなたがそうしなかった場合に、あなたdestinationdestinationType設定を入力しようとすることです。入力されていない場合はBean名に@ActivationConfigProperty設定され、入力されていない場合はに設定されます。destinationdestinationTypejavax.jms.Queue

したがって、すべてが明示的に設定されている場合、上記の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 {
...
于 2010-10-29T22:41:33.090 に答える