2010-12-16 4 views
1

Ich habe eine Java-EE-Anwendung, die eine Message-driven Bean hat und es läuft gut auf JBoss 4, aber wenn ich das Projekt für JBoss 6 konfigurieren und darauf bereitstellen, bekomme ich das Error;jBoss Bereitstellung von Message-Driven Bean spec Verletzung

WARN [org.jboss.ejb.deployers.EjbDeployer.verifier] EJB spec violation: 

... 

The message driven bean must declare one onMessage() method. 

... 

org.jboss.deployers.spi.DeploymentException: Verification of Enterprise Beans failed, see above for error messages. 

Aber meine Bohne hat die onMessage Methode! Es hätte dann auch nicht auf jboss 4 funktioniert.

Warum bekomme ich diesen Fehler?

Edit:

Die Klasse in Frage wie folgt aussieht

package ... 
imports ... 

public class MyMDB implements MessageDrivenBean, MessageListener { 
AnotherSessionBean a; 
OneMoreSessionBean b; 

public MyMDB() {} 

public void onMessage(Message message) { 
    if (message instanceof TextMessage) { 
     try { 
       //Lookup sessionBeans by jndi, create them 
       lookupABean(); 
       // check message-type, then invokie 
       a.handle(message); 
       // else 
       b.handle(message); 

      } catch (SomeException e) { 
        //handling it 
      } 
    } 
} 

public void lookupABean() { 
    try { 
     // code to lookup session beans and create. 
    } catch (CreateException e) { // handling it and catching NamingException too } 
} 
} 

Edit 2: Und das ist die jboss.xml relevanten Teile

<message-driven> 
<ejb-name>MyMDB</ejb-name> 
<destination-jndi-name>topic/A_Topic</destination-jndi-name> 
<local-jndi-name>A_Topic</local-jndi-name> 
<mdb-user>user</mdb-user> 
<mdb-passwd>pass</mdb-passwd> 
<mdb-client-id>MyMessageBean</mdb-client-id> 
<mdb-subscription-id>subid</mdb-subscription-id> 
<resource-ref> 
<res-ref-name>jms/TopicFactory</res-ref-name> 
<jndi-name>jms/TopicFactory</jndi-name> 
</resource-ref> 
</message-driven> 

bearbeiten 3:

Ich habe nur alle meine Gläser aus dem Projekt entfernt und nur relevante hinzugefügt (auch von neuen Versionen), um NoClassDefFound Fehler auszulösen. Noch bleibt das Problem bestehen.

Bearbeiten: Irgendwelche Richtungen, welchen Bereich soll ich betrachten? Mein Projekt oder jboss-configuration oder die Deployment-Einstellungen ??

+0

Können wir die Klasse sehen, die 'onMessage()' implementiert? – skaffman

+0

Es ruft eine andere Session Bean nach dem Überprüfen der Nachricht, warum? Kann ich nicht tun, was ich normalerweise in einer Methode tun kann? – rapadura

+0

@skaffman, aktualisierte die Frage mit dem MB-Bean-Code. – rapadura

Antwort

2

org.jboss.ejb.deployers.EjbDeployer.verifier

für

sieht
public void onMessage(javax.jms.Message) 

über einige Code wie folgt (dies ist aus JBoss5):

/** 
    * Check if the given message is the onMessage() method 
    */ 
    public boolean isOnMessageMethod(Method m) 
    { 
     if ("onMessage".equals(m.getName())) 
     { 
      Class[] paramTypes = m.getParameterTypes(); 
      if (paramTypes.length == 1) 
      { 
      if (Message.class.equals(paramTypes[0])) 
       return true; 
      } 
     } 
     return false; 
    } 

Es importa ist nt, dass der Parametertyp javax.jms.Message ist und nichts anderes, zum Beispiel irgendeine Unterklasse oder Oberklasse oder irgendeine implementierende Klasse.

Ihre Unterschrift ist public void onMessage(Message message), die auf den ersten Blick ok aussieht.

Ein Class ist nur in seiner ClassLoader gleich.Wenn aus irgendeinem Grund javax.jms.Message in verschiedenen Klassenladeprogrammen in derselben JVM verfügbar ist, können je nach ClassLoader des EjbDeployer.verifier seltsame Dinge passieren. Vielleicht hat der EjbDeployer.verifer Zugriff auf javax.jms.Message in einem anderen ClassLoader als MyMDB. Als Ergebnis sind beide javax.jms.Message nicht gleich, obwohl sie den gleichen Byte-Code haben und wörtlich existieren. Die EjbVerifier wird über warnen onMessage fehlt, weil javax.jms.Message auf Classloader A nicht gleich javax.jms.Message auf Classloader B.

Dies kann passieren, wenn Bibliotheken mit javax.jms.Message auf falschen Stellen auf dem JBoss AS kopiert wird. Ich schätze also - aus der Ferne - dass es an falschen Stellen am JBoss oder EAR einige Gläser mit javax.jms.Message gibt. Zum Beispiel einige falsche jbossallclient.jar in der EAR.

1

Stellen Sie sicher, dass Ihre EAR keine eigenen Kopien der javax.ejb Klassen (oder überhaupt javax Klassen) enthält. JBoss 4 und 6 haben eine ziemlich unterschiedliche Classloading-Semantik, und was auf dem einen funktioniert, kann auf dem anderen nicht funktionieren. Wenn Ihr EAR beispielsweise lib eigene Kopien von Message oder MessageListener enthält, funktioniert es möglicherweise nicht mehr.

+0

Ich habe nur überprüft, und es gibt keine javax bezogenen Gläser in meinem Ohr oder in einem der Gläser oder Kriege im Ohr. – rapadura

1

ich versuchte es auf "JBossAS [6.0.0.20100911-M5 "Neo"]" und Eclipse Helios

import javax.ejb.ActivationConfigProperty; 
import javax.ejb.MessageDriven; 
import javax.ejb.MessageDrivenBean; 
import javax.ejb.MessageDrivenContext; 
import javax.jms.Message; 
import javax.jms.MessageListener; 

@MessageDriven(
    activationConfig = { @ActivationConfigProperty(
      propertyName = "destinationType", propertyValue = "javax.jms.Topic" 
    ) }, 
    mappedName = "topic/A_Topic", 
    messageListenerInterface = MessageListener.class) 
public class MyMDB implements MessageListener, MessageDrivenBean { 

    private static final long serialVersionUID = -4923389997501209506L; 

    public MyMDB() { 
     // TODO Auto-generated constructor stub 
    } 
    @Override 
    public void ejbRemove() { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void setMessageDrivenContext(MessageDrivenContext arg0) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void onMessage(Message message) { 
     // TODO Auto-generated method stub 
    } 
} 

und diese Einstellung funktioniert. Haben Sie die gleichen Einfuhren für Ihre Bohne haben (vielleicht war es ein automatischer Import schief gegangen ???)

Verwandte Themen