Frage

Der folgende Fehler trat bei Tomcat / OpenEJB Inbetriebnahme nach dem Upgrade auf 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 )

Das folgende MDB verursacht diesen Fehler:

@MessageDriven(name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")
public class InboundXMLQueueHandler implements MessageListener {
...

, weil nach dem Wechsel zu

@MessageDriven(name="InboundXMLQueueHandlerST")
public class InboundXMLQueueHandler implements MessageListener {
...

Fehler sind verschwunden.

Wie Sie sehen können wir definieren zwei Zuhörer einzelne Klasse und kommagetrennte Warteschlangennamen in Anmerkungen verwenden. Dies funktionierte einwandfrei mit 3.1.2 (zumindest schien es), aber jetzt gibt es uns den Fehler oben (obwohl der Fehler scheint nicht den Einsatz von MEB zu verhindern, aber JMX-Überwachung ist entscheidend für uns).

Ich kann kein Anwendungsbeispiel @MessageDriven Annotation mit mehreren Warteschlangen (einzelner MDB-Klasse, mehr durch Komma getrennte Warteschlangennamen) finden mehr auch nicht. Ist dies ein falscher Weg, es zu tun? Ist es ein dokumentiertes Feature? Was in 3.1.3 geändert, so dass JMX nicht MDB registriert mehr?

War es hilfreich?

Lösung

Hmm, wir haben JMX Unterstützung nicht in 3.1.2. Ich habe persönlich nie versucht, ein MDB zu zwei Warteschlangen Einhaken - eine Art überrascht, dass gearbeitet. Es ist ActiveMQ, dass die tatsächliche „queue Einhaken“ (Standards Job des JMS-Stecker) der Fall ist, geben wir nur die Meta-Daten über.

Auf der OpenEJB Seite, die einzige Magie, dass wir tun, ist versucht zu füllen in Ihren destination und destinationType Einstellungen über @ActivationConfigProperty, wenn Sie noch nicht getan haben. Wir werden destination zu Ihrem Bean Namen gesetzt, wenn das nicht ausgefüllt wird, und wir werden destinationType auf javax.jms.Queue gesetzt, wenn das nicht gefüllt ist.

So Ihre Bohne oben im Wesentlichen wie folgt aussehen würde, wenn alle explizit festgelegt wurde.

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

Unter der Annahme, ActiveMQ tatsächlich Ihnen beiden Warteschlangen gab, ist dies die activationConfig, die es tun würde.

Wahrscheinlich zu versuchen, die einfachste Sache ist, zu den Zielnamen explizit festgelegt und löschen Sie einfach den bean Namen.

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top