Error despliegue MDB con múltiples nombres de cola en OpenEJB
-
27-09-2019 - |
Pregunta
apareció el siguiente error en el arranque de Tomcat / OpenEJB después de la actualización a 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 )
La siguiente MDB provoca este error:
@MessageDriven(name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")
public class InboundXMLQueueHandler implements MessageListener {
...
porque después de cambiar a
@MessageDriven(name="InboundXMLQueueHandlerST")
public class InboundXMLQueueHandler implements MessageListener {
...
se ha ido de error.
Como se puede ver se definen dos oyentes que utilizan la misma clase y nombres de cola separados por comas en las anotaciones. Esto funcionó a la perfección con la sección 3.1.2 (al menos eso parecía) pero ahora se nos da el error anterior (aunque no parece que el error para evitar el despliegue de BMD pero monitorización JMX es fundamental para nosotros).
No puedo encontrar ningún ejemplo de anotación uso @MessageDriven
con varias colas (MDB clase única, múltiples nombres de cola separados por comas) más bien. ¿Es esta una manera incorrecta de hacerlo? Es una característica documentada? ¿Qué cambió en 3.1.3 por lo que no se puede registrar JMX MDB más?
Solución
Hmm, que no tenía el apoyo de JMX en 3.1.2. Yo personalmente nunca he intentado enganchar un MDB hasta dos colas - más o menos sorprendido que funcionó. Es ActiveMQ que hace la "cola de enganchar" real (normas de trabajo del conector JMS), que sólo tiene que pasar los meta-datos a través de.
En el lado OpenEJB, la única magia que hacemos es tratar de relleno en la configuración de destination
y destinationType
través @ActivationConfigProperty
si no lo ha hecho. Vamos a configurar destination
a su nombre de frijol que si no se rellena y la fijaremos destinationType
a javax.jms.Queue
que si no se rellena.
Así que su frijol anterior podría tener este aspecto esencialmente si todo se ha establecido explícitamente.
@MessageDriven(
name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT",
activationConfig = {
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
Suponiendo ActiveMQ en realidad le estaba dando ambas colas, este es el activationConfig que lo haría.
Probablemente la cosa más simple es tratar de establecer explícitamente el nombre del destino y simplemente borrar el nombre del bean.
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName = "destination",
propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...