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?

¿Fue útil?

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 {
...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top