Question

L'erreur suivante est apparue au démarrage Tomcat / OpenEJB après mise à niveau vers 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 )

Le MDB suivant provoque cette erreur:

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

parce que, après le passage à

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

erreur a disparu.

Comme vous pouvez le voir, nous définissons deux auditeurs en utilisant une seule classe et les noms de file d'attente séparées par des virgules dans les annotations. Cela a fonctionné parfaitement avec 3.1.2 (il semblait au moins), mais maintenant, il nous donne l'erreur ci-dessus (si l'erreur ne semble pas empêcher le déploiement de BDM, mais la surveillance JMX est essentielle pour nous).

Je ne peux pas trouver un exemple d'utilisation de l'annotation @MessageDriven avec plusieurs files d'attente (classe unique MDB, plusieurs noms de file d'attente séparées par des virgules) plus soit. Est-ce une mauvaise façon le faire? Est-ce une caractéristique documentée? Ce qui a changé en 3.1.3 afin que JMX ne peut pas enregistrer plus MDB?

Était-ce utile?

La solution

Hmm, nous n'avions pas le soutien JMX en 3.1.2. J'ai personnellement jamais essayé accrocher un MDB jusqu'à deux files d'attente - une sorte de surprise qui a fonctionné. Il est ActiveMQ qui fait la « file d'attente accrochage » réelle (normes d'emploi du connecteur JMS), on passe simplement les méta-données sur.

Du côté OpenEJB, la seule magie que nous faisons est tenter de combler vos paramètres de destination et destinationType via @ActivationConfigProperty si vous ne l'avez pas fait. Nous allons mettre destination à votre nom de haricots si ce n'est pas rempli et nous allons mettre à destinationType javax.jms.Queue si ce n'est pas remblayé.

bean ci-dessus ressemblerait essentiellement comme celui-ci si tout a été explicitement définie.

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

En supposant ActiveMQ effectivement vous donnait les deux files d'attente, c'est le activationConfig qui le faire.

Probablement la chose la plus simple est d'essayer de définir explicitement le nom de destination et simplement supprimer le nom de haricot.

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top