Domanda

Il seguente errore è apparso in fase di avvio Tomcat / OpenEJB dopo l'aggiornamento a 3.1.3 OpenEJB:

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 )

Il seguente MDB causa questo errore:

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

, perché dopo aver cambiato a

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

errore è scomparso.

Come si può vedere si definiscono due ascoltatori che utilizzano classe singola e nomi di coda separati da virgola in annotazioni. Questo ha funzionato perfettamente con 3.1.2 (almeno sembrava) ma ora ci dà l'errore precedente (anche se l'errore non sembra per impedire il dispiegamento di MDB ma il monitoraggio JMX è fondamentale per noi).

Non sono in grado di trovare alcun esempio di utilizzo @MessageDriven annotazioni con più code (singola classe MDB, più nomi di coda separati da virgola) più neanche. È questo un modo sbagliato farlo? E 'una caratteristica documentata? Che cosa è cambiato in 3.1.3 in modo che JMX non può registrare più MDB?

È stato utile?

Soluzione

Hmm, non abbiamo avuto il supporto JMX in 3.1.2. Ho personalmente mai provato agganciando un MDB fino a due code - una sorta di sorpresa che ha funzionato. E 'ActiveMQ che fa la "coda di aggancio" attuale (standard di lavoro del connettore JMS), abbiamo appena passiamo i meta-dati sopra.

Sul lato OpenEJB, l'unica magia che facciamo è cercare di riempimento nelle impostazioni destination e destinationType via @ActivationConfigProperty se non l'hai fatto. Imposteremo destination al tuo nome di fagioli se questo non viene compilato e la regoleremo destinationType a javax.jms.Queue se questo non viene compilato.

Quindi, il bean di cui sopra sarebbe sostanzialmente simile a questa, se tutto è stato impostato in modo esplicito.

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

Supponendo ActiveMQ in realtà si stava dando entrambe le code, questo è l'activationConfig che lo farebbe.

Probabilmente la cosa più semplice da provare è di impostare in modo esplicito il nome della destinazione e basta cancellare il nome di fagioli.

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top