在 CDI 项目中启动 EJB 依赖项

Starting a EJB dependency in CDI project

好吧,我需要使用@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 添加到我的项目中会不会有任何冲突?因为我的项目已经在生产中了。

为您解除后顾之忧:

1) CDI Bean inside a EJB Bean, this is possible ?

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

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

2) How can i add the ejb to my pom.xml ?

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

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

3) If i add EJB to my project can have any conflicts ?

恐怕这个问题太笼统了;我不知道你的项目。但我会继续说 "no"。至少就CDI和EJB而言,你应该能应付得了。