2010-12-16 3 views
1

У меня есть приложение Java EE, которое имеет один управляемый сообщениями компонент, и он отлично работает на JBoss 4, однако, когда я настраиваю проект для JBoss 6 и развертываю на нем, я получаю это ошибка;jBoss развертывание нарушения спецификации bean-сообщений с сообщением

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. 

Но моя фасоль имеет метод onMessage! Тогда он не работал бы на jboss 4.

Зачем нужна эта ошибка !?

Edit:

Класс в вопросе выглядит следующим образом

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: И это jboss.xml соответствующие части

<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> 

Редактировать 3:

Я только что удалил все мои банки из проекта и только повторно добавил соответствующие (из новых версий), чтобы выпустить ошибки NoClassDefFound. Все еще проблема остается.

Редактировать: Любые указания, на какой области я должен смотреть? Мой проект, или jboss-configration, или настройки развертывания?

+0

Можно ли увидеть класс, реализующий `onMessage()`? – skaffman 2010-12-16 14:37:06

+0

Он вызывает другой сеанс после проверки сообщения, почему? Не могу ли я делать то, что я обычно могу сделать в методе? – rapadura 2010-12-16 15:04:44

ответ

2

org.jboss.ejb.deployers.EjbDeployer.verifier

ищет

public void onMessage(javax.jms.Message) 

через некоторый код, как это (это от 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; 
    } 

это IMPORTA nt, что тип параметра равен javax.jms.Message и ничего другого, например, какого-либо подкласса или суперкласса или какого-либо реализующего класса.

Ваша подпись public void onMessage(Message message), которая выглядит нормально на первый взгляд.

A Class равно только в его ClassLoader.Если по каким-то причинам javax.jms.Message доступен в разных загрузчиках классов в одной JVM, могут произойти странные вещи, в зависимости от ClassLoader EjbDeployer.verifier. Возможно, EjbDeployer.verifer имеет доступ к javax.jms.Message в другом ClassLoader как MyMDB. В результате оба javax.jms.Message не равны друг другу, хотя они являются одним и тем же байтовым кодом и буквально существуют. EjbVerifier предупредит об отсутствии onMessage, потому что javax.jms.Message на ClassLoader А не равна javax.jms.Message на ClassLoader В.

Это может произойти, когда библиотеки с javax.jms.Message копируется на неправильных местах на JBoss AS. Поэтому, я думаю, издалека, что есть несколько банок, содержащих javax.jms.Message в неправильных местах на JBoss или EAR. Например, некорректный jbossallclient.jar в EAR.

1

Убедитесь, что ваш EAR не содержит собственных копий классов javax.ejb (или любых классов javax вообще). JBoss 4 и 6 имеют довольно разную семантику классов, и то, что работает на одном, может не работать на другом. Например, если ваш EAR lib содержит свои собственные копии Message или MessageListener, он может перестать работать.

1

Я попробовал его на "JBossAS [6.0.0.20100911-M5 "Neo"]" и 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 
    } 
} 

И эта настройка. Есть ли у вас те же импорт для бобов (возможно, был автоматический импорт пошло не так ???)

 Смежные вопросы

  • Нет связанных вопросов^_^