Soy bastante nuevo en Java EE, así que esto podría ser estúpido ... tengan paciencia conmigo por favor: D¿Cómo inyectar un Bean Session en un Bean Driveled Message?
Me gustaría inyectar un bean de sesión sin estado en un bean controlado por mensajes. Básicamente, el MDB recibe un mensaje JMS y luego usa un bean de sesión para realizar el trabajo. El bean de sesión contiene la lógica comercial.
Aquí es mi bean de sesión:
@Stateless
public class TestBean implements TestBeanRemote {
public void doSomething() {
// business logic goes here
}
}
La interfaz de juego:
@Remote
public interface TestBeanRemote {
public void doSomething();
}
Aquí está mi 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();
}
}
Hasta el momento, no es ciencia de cohetes, ¿verdad?
Por desgracia, al implementar esta a GlassFish v3, y el envío de un mensaje a la adecuada cola JMS, tengo errores que GlassFish es incapaz de localizar el 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]]]
Así que mis preguntas son:
- ¿es esta la forma correcta de inyectar un bean de sesión en otro bean (particularmente un bean controlado por mensajes)?
- ¿por qué falla la búsqueda de nombres?
Estoy un poco más lejos ahora. @LocalBean identifica un bean sin una interfaz. Así que esto no es lo que quiero, aunque funciona: D – Hank
Deberías haber usado "@EJB private TestBeanRemote testBean;" – Dagvadorj