0

我想让一些方法运行,只有在我的 WAR 部署到 JBoss 之后。

问题:目前我正在使用@PostConstruct 从数据库加载保存的时间表。问题是我正在从这个方法创建调度程序的实例,这反过来又启动了 Quartz 调度程序,这阻止了 JBoss 完成部署。如果没有要加载的计划,我的 WAR 部署正常,但如果有计划,它们会导致部署失败,因为 JBoss 正在“等待”计划实际完成。

有没有办法将方法调用延迟到完全部署之后?或者,是否可以在服务器上进行异步调用(来自服务器代码)?

4

3 回答 3

1

Java EE 规范严格限制应用程序服务器提供的设施之外的任何线程操作。

在任何情况下,您都不应该在无限循环中使用容器管理线程;容器期望线程被返回。线程创建仍然可以在没有太多附带损害的情况下完成(如果您不将多个应用程序放在服务器上,因为容器将无法管理所有应用程序之间的资源),但必须返回任何容器线程。

在新的 Jboss 7 中,有一些 Java EE 调度工具(@Scheduling 和计时器,以及可能的持久计时器)。快速搜索显示了一些如何在 JBoss 7 中运行 Quartz 的示例:如何在 Jboss AS 7.0 中启用 Quartz 调度?

在较旧的 JBoss 中存在更高级的集成(JCA 集成是获得更精细线程管理的唯一标准方法)。使用谷歌找到它们。

于 2012-07-20T12:26:57.140 回答
0

简单的ServletContextListener不会为您解决问题吗?只需在 contextInitialized 方法中实现您需要的任何内容。

于 2012-07-21T22:15:16.047 回答
0

在 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");
        }  
于 2013-06-14T07:45:45.810 回答