glassfish - 如何将 session Bean 注入(inject)消息驱动 Bean?

标签 glassfish cdi java-ee-6 ejb-3.1 glassfish-3

我对 Java EE 相当陌生,所以这可能很愚蠢。请多多包涵:D

我想将无状态 session bean 注入(inject)消息驱动 bean。基本上,MDB 获得一条 JMS 消息,然后使用 session bean 来执行工作。 session bean 保存业务逻辑。

这是我的 session 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 v3 并向适当的 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]]]

所以我的问题是:
  • 这是将 session bean 注入(inject)另一个 bean(特别是消息驱动 bean)的正确方法吗?
  • 为什么命名查找失败?
  • 最佳答案

    你能试着定义这样的事情吗:

    @Remote
    public interface TestBeanRemote {
    
      public void doSomething();
    }
    
    @Stateless(name="TestBeanRemote")
    public class TestBean implements TestBeanRemote {
    
      public void doSomething() {
        // business logic goes here
      }
    }
    

    然后在 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(beanName="TestBeanRemote")
        private TestBeanRemote testBean;
    
        public TestController() {
        }
    
        public void onMessage(Message message) {
          testBean.doSomething();
        }
    }
    

    如果这项工作,我会尝试提供一个解释:)

    关于glassfish - 如何将 session Bean 注入(inject)消息驱动 Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465033/

    相关文章:

    java - 如何修复 'javax.xml.parsers.FactoryConfigurationError on every second server startup'

    java - ManagedBeanCreationException : Unable to create managed bean richBean

    java - 有没有关于加载时间字节码转换而不在java命令行中指定javaagent选项的解决方案

    jsf - WELD-001409 类型 [EagerBeansRepository] ​​的不明确依赖项

    jakarta-ee - 使用 CDI 注入(inject)非托管类?

    java - 从 Eclipse 启动 Glassfish Server 时出错

    java - J2EE JTA 事务回滚在 OSE Glassfish 4.0(Build 89)上不起作用

    java - 在 EJB 3.1 中控制 CDI 启动

    javascript - 可编辑网格中的组合框

    java - Spring+Hibernate配置