Erro a implantar o MDB com vários nomes de filas no OpenEJB
-
27-09-2019 - |
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?
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 {
...