Pergunta

O erro a seguir apareceu na startup TomCat/OpenEJB após a atualização para o 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 )

O seguinte MDB causa este erro:

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

Porque depois de mudar para

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

O erro se foi.

Como você pode ver, definimos dois ouvintes usando nomes de fila de classe única e separados por vírgula em anotações. Isso funcionou perfeitamente com 3.1.2 (pelo menos parecia), mas agora nos dá o erro acima (embora o erro não pareça impedir a implantação de MDBs, mas o monitoramento JMX é fundamental para nós).

Não consigo encontrar qualquer exemplo de uso @MessageDriven Anotação com várias filas (classe MDB única, vários nomes de filas separados por vírgula) também. É uma maneira errada, faça isso? É um recurso documentado? O que mudou em 3.1.3 para que o JMX não possa mais registrar o MDB?

Foi útil?

Solução

Hmm, não tivemos suporte ao JMX em 3.1.2. Pessoalmente, nunca tentei conectar um MDB até duas filas - meio que surpreso que funcionou. É o ActiveMQ que faz a "fila de mão" (trabalho de padrões do conector JMS), apenas passamos os metadados.

No lado do OpenEjb, a única mágica que fazemos é tentar preencher seu destination e destinationType Configurações via @ActivationConfigProperty Se você não fez isso. Bem definido destination para o seu nome de feijão, se isso não for preenchido e nós definiremos destinationType para javax.jms.Queue Se isso não for preenchido.

Portanto, seu feijão acima se faria essencialmente assim se tudo fosse definido explicitamente.

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

Supondo que o ActiveMQ realmente estava dando a você as duas filas, este é o ActivationConfig que o faria.

Provavelmente, a coisa mais simples a tentar é definir explicitamente o nome de destino e apenas excluir o nome do feijão.

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top