gpt4 book ai didi

ejb-3.0 - Java EE 6 : controlling startup of managed beans with dependencies: CDI, EJB

转载 作者:行者123 更新时间:2023-12-02 20:52:42 25 4
gpt4 key购买 nike

我刚刚在Java EE 6 @javax.annotation.ManagedBean vs. @javax.inject.Named vs. @javax.faces.ManagedBean上阅读了关于各种托管bean及其关系的非常好的解释。当我在应用程序中遇到一个恼人的问题时,我想知道是否可以控制或影响 Bean 的启动方式和时间。

在我的 Java EE 应用程序中,我使用 EJB、CDI 和 JSF2 作为 View 技术。通过 SPI,启动来自第三方的服务,并配置一个作业执行器,该执行器启 Action 业并处理其他与计时器相关的内容。当作业执行器完成引导后,一项作业将立即执行。该作业使用 CDI 注入(inject)来访问某些 Bean,其中一个 Bean 使用 EJB。

现在的问题是,大多数时候 Java EE 6 服务器 (JBoss 7.1.1) 启动 EJB 仍然不可用,然后作业会尝试访问它。抛出异常并且作业失败,并且构建服务以停用该失败的作业。好吧,停用失败的作业似乎并不算太​​糟糕。作业重新启动并运行的唯一解决方案是取消部署并再次重新部署。不幸的是,这是一项手动任务,无法以编程方式完成。

而且,更糟糕的是:在极少数情况下,这种情况不会发生。

所以,我现在的问题是:我能否以某种方式控制 EJB 和 CDI bean 的初始化和部署,以便我可以确保所有 EJB bean 在初始化 CDI bean 之前都已初始化?

我已在 EAR application.xml 中将按顺序初始化设置为 true 并设置 EJB 的顺序,以便它们按照我需要的方式进行初始化(EJB 核心,然后是 EJB 业务,然后是 WAR),但是基于 CDI 的服务作为 JAR 放置在 lib 文件夹中。

最佳答案

摘自Java EE 6 Tutorial经过一些修改:

@Singleton
@Startup
public class BeanA { ... }

@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface EjbStarted {}

@Singleton
@Startup
@DependsOn("BeanA", "BeanB", "BeanC")
public class LastBean {
@Inject @EjbStarted Event<String> event;

@PostConstruct
public void startService() {
// At this moment PrimaryBean is ready for use
event.fire("LastBean");
}
}

public class CDIService {
public void start(@Observes @EjbStarted String name) {
if("LastBean".equals(name)) {
startService();
}
}
}

更新:在思考这个问题时,我不知何故忘记了您想要 CDI beans 中的初始化顺序,所以答案有点断章取义,对此感到抱歉:)

更新 2:添加了如何在 EJB 之后启动 CDI 服务

关于ejb-3.0 - Java EE 6 : controlling startup of managed beans with dependencies: CDI, EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com