OpenEJBで複数のキュー名を使用してMDBを展開するエラー
-
27-09-2019 - |
質問
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で何が変わったのですか?
解決
うーん、3.1.2にJMXサポートがありませんでした。私は個人的にMDBを最大2つのキューに接続しようとしたことはありませんでした - それがうまくいきました。実際の「キューフックアップ」(JMSコネクタの標準ジョブ)を実行するのはActiveMQであり、Meta-Dataを渡すだけです。
Openejb側では、私たちがする唯一の魔法はあなたを埋めようとすることです destination
と destinationType
経由の設定 @ActivationConfigProperty
あなたがそうしていないなら。設定します destination
それが記入されていない場合、あなたの豆の名前に destinationType
に javax.jms.Queue
それが記入されていない場合。
したがって、すべてが明示的に設定された場合、上記の豆は本質的にこのように見えます。
@MessageDriven(
name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT",
activationConfig = {
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
ActiveMQが実際に両方のキューを提供していると仮定すると、これがそれを行うActionConfigです。
おそらく試してみる最も簡単なことは、宛先名を明示的に設定し、Bean名を削除することです。
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...