我对Java EE是比较新的,所以这可能是愚蠢的。请耐心等待我请求:D如何将会话Bean注入消息驱动Bean?
我想将无状态会话bean注入消息驱动bean。基本上,MDB获取JMS消息,然后使用会话bean执行工作。会话bean拥有业务逻辑。
这里是我的会话Bean:
@Stateless
public class TestBean implements TestBeanRemote {
public void doSomething() {
// business logic goes here
}
}
匹配接口:
@Remote
public interface TestBeanRemote {
public void doSomething();
}
这里是我的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();
}
}
到目前为止,不是火箭科学,对吧?
不幸的是,在部署时,这GlassFish的第三版,并且将消息发送到相应的JMS队列,我得到的错误,GlassFish是无法找到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]]]
所以我的问题是:
- 这是将会话bean注入另一个bean(特别是消息驱动bean)的正确方法吗?
- 为什么命名查找失败?
我现在有点远了。 @LocalBean标识没有接口的bean。所以这不是我想要的,即使它有效:D – Hank 2010-03-18 07:34:47
您应该使用“@EJB private TestBeanRemote testBean;” – Dagvadorj 2013-04-13 11:23:53