Comment injecter un Bean de Session dans un Message Driven Bean?

Que je suis assez nouveau à Java EE, donc cela peut être stupide.. ours avec moi pls 😀

Je voudrais injecter un bean session sans état dans un message-driven bean. Fondamentalement, le MDB reçoit un message de JMS, puis utilise un bean de session pour effectuer le travail. La session bean détient la logique métier.

Voici ma Session Bean:

@Stateless
public class TestBean implements TestBeanRemote {

  public void doSomething() {
    //business logic goes here
  }
}

Le correspondant de l'interface:

@Remote
public interface TestBeanRemote {

  public void doSomething();
}

Voici mon MDB:

@MessageDriven(mappedName = "jms/mvs.TestController", activationConfig =  {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class TestController implements MessageListener {

 @EJB
 private TestBean testBean;

    public TestController() {
    }

    public void onMessage(Message message) {
      testBean.doSomething();
    }
}

Jusqu'à présent, pas la science de fusée, droit?

Malheureusement, lors du déploiement de ce à glassfish v3, et l'envoi d'un message à la appropriée de File d'attente JMS, j'ai des erreurs que glassfish est incapable de localiser le TestBean EJB:

java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session into class mvs.test.TestController
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session into class mvs.test.TestController
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/mvs.test.TestController/testBean' in SerialContext  [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=mvs.test.TestController/testBean,Remote 3.x interface =mvs.test.TestBean,ejb-link=null,lookup=null,mappedName=,jndi-name=mvs.test.TestBean,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'mvs.test.TestBean#mvs.test.TestBean' [Root exception is javax.naming.NamingException: Lookup failed for 'mvs.test.TestBean#mvs.test.TestBean' in SerialContext  [Root exception is javax.naming.NameNotFoundException: mvs.test.TestBean#mvs.test.TestBean not found]]]

Donc mes questions sont:

  • est-ce la bonne façon de l'injection d'un bean de session dans un autre bean (en particulier un message driven bean)?
  • pourquoi la dénomination de recherche de défaut?
InformationsquelleAutor Hank | 2010-03-17