我想让一些方法运行,只有在我的 WAR 部署到 JBoss 之后。
问题:目前我正在使用@PostConstruct 从数据库加载保存的时间表。问题是我正在从这个方法创建调度程序的实例,这反过来又启动了 Quartz 调度程序,这阻止了 JBoss 完成部署。如果没有要加载的计划,我的 WAR 部署正常,但如果有计划,它们会导致部署失败,因为 JBoss 正在“等待”计划实际完成。
有没有办法将方法调用延迟到完全部署之后?或者,是否可以在服务器上进行异步调用(来自服务器代码)?
我想让一些方法运行,只有在我的 WAR 部署到 JBoss 之后。
问题:目前我正在使用@PostConstruct 从数据库加载保存的时间表。问题是我正在从这个方法创建调度程序的实例,这反过来又启动了 Quartz 调度程序,这阻止了 JBoss 完成部署。如果没有要加载的计划,我的 WAR 部署正常,但如果有计划,它们会导致部署失败,因为 JBoss 正在“等待”计划实际完成。
有没有办法将方法调用延迟到完全部署之后?或者,是否可以在服务器上进行异步调用(来自服务器代码)?
Java EE 规范严格限制应用程序服务器提供的设施之外的任何线程操作。
在任何情况下,您都不应该在无限循环中使用容器管理线程;容器期望线程被返回。线程创建仍然可以在没有太多附带损害的情况下完成(如果您不将多个应用程序放在服务器上,因为容器将无法管理所有应用程序之间的资源),但必须返回任何容器线程。
在新的 Jboss 7 中,有一些 Java EE 调度工具(@Scheduling 和计时器,以及可能的持久计时器)。快速搜索显示了一些如何在 JBoss 7 中运行 Quartz 的示例:如何在 Jboss AS 7.0 中启用 Quartz 调度?
在较旧的 JBoss 中存在更高级的集成(JCA 集成是获得更精细线程管理的唯一标准方法)。使用谷歌找到它们。
简单的ServletContextListener不会为您解决问题吗?只需在 contextInitialized 方法中实现您需要的任何内容。
在 JBoss 7 中,有一个管理 API。
也许您可以使用它来检查服务器是否已启动(使用单例和 TimerService)。
示例代码:
ModelControllerClient client = ModelControllerClient.Factory.create(InetAddress.getByName("localhost"), 9999);
ModelNode op = new ModelNode();
op.get(ClientConstants.OP).set("read-attribute");
op.get(ClientConstants.NAME).set("server-state");
ModelNode returnVal = client.execute(op);
if(StringUtils.equals(returnVal.get("result").toString(), "\"running\"")){
LOGGER.info("Server running, init start actions");
timer.cancel();
}else{
LOGGER.info("Server not running, wait");
}