سؤال

ظهر الخطأ التالي عند بدء تشغيل 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 (على الأقل يبدو) ، لكنه الآن يعطينا الخطأ أعلاه (على الرغم من أن الخطأ لا يبدو أنه يمنع نشر MDBs لكن مراقبة JMX أمر بالغ الأهمية بالنسبة لنا).

أنا غير قادر على العثور على أي مثال على الاستخدام @MessageDriven التعليقات التوضيحية مع قوائم قوائم متعددة (فئة MDB واحدة ، أسماء قائمة انتظار متعددة مفصولة بفاصلة) بعد الآن. هل هذه طريقة خاطئة تفعل ذلك؟ هل هي ميزة موثقة؟ ما الذي تغير في 3.1.3 بحيث لا يمكن لـ JMX تسجيل MDB بعد الآن؟

هل كانت مفيدة؟

المحلول

حسنًا ، لم يكن لدينا دعم JMX في 3.1.2. أنا شخصياً لم أحاول أبدًا تثبيت MDB حتى طابورتين - فوجئت نوعًا ما الذي نجح. إنه ActiveMq الذي يقوم "قائمة الانتظار" الفعلية (مهمة معايير موصل JMS) ، نقوم فقط بتمرير بيانات التعريف.

على جانب 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 كان في الواقع يمنحك قوائم الانتظار ، فهذه هي ActivationConfig التي ستفعل ذلك.

ربما أبسط شيء يجب تجربته هو تعيين اسم الوجهة بشكل صريح وحذف اسم الفاصوليا.

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top