部署可以自行停止吗?

时间:2014-05-15 12:57:37

标签: java jboss wildfly wildfly-8

我目前正在寻找一种以编程方式停止在wildfly上部署的方法。

背景:

  • 应用程序在启动阶段使用MBean执行一些运行状况检查。
  • 如果应用确定环境无效,因为缺少某些资源,则需要停止自己的部署。

它的方式:

  • 该应用程序以前在JBoss 4上运行,只是使用JMX停止整个app服务器调用shutdown命令。
  • 如果此命令失败,它只是使用System.exit(1)终止整个JVM。

当前问题:

  • 通过JMX调用shutdown()对wildfly无效,因为整个服务器在尝试从已部署的应用程序中停止时会挂起。
  • System.exit()也无法正常工作,因为必须以任何方式捕获命令。

那么有没有人知道如何从部署中停止服务器或停止部署过程或取消部署应用程序?

非常感谢!

4 个答案:

答案 0 :(得分:2)

我假设,如果某些运行状况检查失败,则核心问题是停止部署过程。在应用启动过程中引发运行时异常足以完成任务。

@Startup
@Singleton
public class StartupBean {


    @PostConstruct
    public void start() {
        //your checks
        boolean check = doHealthCheck();
        if(!check){
           throw new RuntimeException("Your error message");
        }

    }
}

@Startup
@Singleton
public class StartupBean {


    @PostConstruct
    public void start() {
        //your checks
        boolean check = doHealthCheck();
        if(!check){
           throw new Error("Your error message");
        }

    }
}

答案 1 :(得分:1)

我建议你试试WildFly CLI: Running the CLI 或使用Marker Files

但无论如何,我不确定服务器的行为方式。例如,当您myWarName.dodeploy时添加文件myWarName.isdeploying时会发生什么。因此,请告诉我们您何时会获得本主题的一些经验(非常有趣)。

答案 2 :(得分:0)

好的,我还没有设法取消部署应用程序,但我已经能够在出现错误时关闭服务器。这并不完美,但与旧版JBoss上的应用程序的行为相匹配,所以我认为它并不是太糟糕。

我现在正在调用CLI界面

try {
  String jbossBinDir = System.getProperty("jboss.server.base.dir").replace("standalone", "bin");
  Runtime.getRuntime().exec("sh " + jbossBinDir + "/jboss-cli.sh -c command=:shutdown");
} catch(IOException e) {
  ...
}

这对我们来说很可靠。

在我上面的评论中,我说执行返回错误代码,但这可能就是这种情况,因为我必须在命令调用中输入错字。

答案 3 :(得分:0)

如果我们的数据库架构与应用程序的期望不匹配,我们将使用CDI扩展来中止部署:

class MyValidatingExtension implements javax.enterprise.inject.spi.Extension {

    void deploymentValidationFinished(@Observes AfterDeploymentValidation afterDeploymentValidation) {
        if (!stateExpected) {
            afterDeploymentValidation.addDeploymentProblem(new IDontLikeThisException());
        }
    }
}

WAR的部署将失败,异常的堆栈跟踪列为DeploymentProblem,使您的WAR处于取消部署状态。此解决方案独立于容器实现,它仅使用CDI标准机制。请注意,这不会停止/关闭服务器!