Fehler MDB mit mehreren Warteschlangennamen in OpenEJB Bereitstellen
-
27-09-2019 - |
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?
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 {
...