【问题标题】:Starting a EJB dependency in CDI project在 CDI 项目中启动 EJB 依赖项
【发布时间】:2016-07-10 21:10:25
【问题描述】:

好吧,我需要使用@Schedule (EJB) 将任务放入 crontab。我知道 CDI 没有这个(不开心),只有 EJB。我所有的bean都是CDI管理的,所以我对在这个项目中包含EJB有些疑问,希望你能帮助我:

1) 我将创建一个新的 bean 来使用 @Schedule,但我不知道这个 bean 应该使用 @Singleton (EJB) 还是 @Named + @RequestScoped (CDI)。我的想法是:

@Singleton
public class RoboFtp implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Inject
    private VideoBOImpl videoBO;

    @Schedule(...)
    public void coletarVideo(){
        //do something each 3 seconds
    }

}

请注意,我在 EJB Bean 中有一个 CDI Bean,这可能吗?上面的这个豆子是正确的吗?

2) 如何将 ejb 添加到我的 pom.xml 中?

3) 如果我将 EJB 添加到我的项目中会不会有任何冲突?因为我的项目已经在生产中了。

【问题讨论】:

  • 你能给我举个例子,如何只用 CD​​I 来做吗?
  • JDK 8 可以创建定时执行器,有什么问题?
  • 我知道如何用 Spring 注入 bean。不知道如何对 CDI 做同样的事情,但我敢打赌它是相似的。
  • 我没有使用 Spring。
  • 我知道,但 Java EE 中的依赖注入实际上是由 Rod Johnson 编写的。我确定注释是相似的。创建其中之一并按照您的方式注入:docs.oracle.com/javase/8/docs/api/java/util/concurrent/…

标签: ejb cdi


【解决方案1】:

打消你的顾虑:

1) EJB Bean 中的 CDI Bean,这可能吗?

CDI && EJB 可以很好地协同工作。事实上,CDI 也会检测 EJB bean 并将它们转换为 CDI bean。因此,如果您创建 @Stateful bean,它也将作为 CDI bean 被拾取。这意味着您将能够在那里执行任何与 CDI 相关的魔法,同时仍然具有 EJB 功能。

关于注解的选择,@Singleton 听起来很合理;或者可能是@Stateful?。 @RequestScoped 只会在请求期间存活并在之后死亡,因此会终止您的定期任务。根据您的任务的性质选择范围(一个 bean 与许多/短期与永久/..)。只要确保将其设为 EJB bean,CDI 就会随之而来。

2) 如何将 ejb 添加到我的 pom.xml 中?

假设您有 Maven 项目,添加对 EJB api 的依赖,实现将由您的 Java EE 应用服务器提供。

<dependency>
  <groupId>javax.ejb</groupId>
  <artifactId>ejb-api</artifactId>
  <version>${desiredVersion}</version>
</dependency>

3) 如果我将 EJB 添加到我的项目中可能会有任何冲突?

恐怕这个问题太笼统了;我不知道你的项目。但我会继续说“不”。至少就 CDI 和 EJB 而言,您应该能够处理它。

【讨论】:

  • 非常有用的信息,但最后一个问题:我需要应用服务器(Jboss、Glassfish、TomEE)来运行 EJB 吗?我可以在tomcat7中运行吗?
  • Tomcat 在 servlet 中,因此不需要支持 EJB。您将需要一个合适的服务器。采用一种(假设您现在拥有 Tomcat)的最简单方法可能是 TomEE。顺便说一句,如果您觉得这些信息足够,请将我的回答标记为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2020-08-02
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多