Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 部署可以自行停止吗?_Java_Jboss_Wildfly_Wildfly 8 - Fatal编程技术网

Java 部署可以自行停止吗?

Java 部署可以自行停止吗?,java,jboss,wildfly,wildfly-8,Java,Jboss,Wildfly,Wildfly 8,我目前正在寻找一种方法,以编程方式停止wildfly上的部署 背景: 应用程序在启动阶段使用MBean进行一些运行状况检查 如果应用程序由于缺少某些资源而确定环境无效,则需要停止自己的部署 事情是这样的: 该应用程序以前在JBoss4上运行,只是使用JMX停止了整个应用服务器调用shutdown命令 如果这个命令失败,它将使用System.exit(1)终止整个JVM 当前的问题: 通过JMX调用shutdown()在wildfly上不起作用,因为当试图从部署的应用程序中停止它时,整个

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

背景:

  • 应用程序在启动阶段使用MBean进行一些运行状况检查
  • 如果应用程序由于缺少某些资源而确定环境无效,则需要停止自己的部署
事情是这样的:

  • 该应用程序以前在JBoss4上运行,只是使用JMX停止了整个应用服务器调用shutdown命令
  • 如果这个命令失败,它将使用System.exit(1)终止整个JVM
当前的问题:

  • 通过JMX调用shutdown()在wildfly上不起作用,因为当试图从部署的应用程序中停止它时,整个服务器都会挂起
  • System.exit()也将不起作用,因为必须以任何方式捕获命令
那么,有人知道如何在部署中停止服务器、停止部署过程或取消部署应用程序吗


非常感谢

我建议您尝试使用WildFly CLI: 或使用


但无论如何,我不确定服务器将如何运行。例如,当存在
myWarName.isdeploying
时,添加文件
myWarName.dodeploy
会发生什么情况。因此,请告诉我们您什么时候能在本主题中获得一些经验(这很有趣)。

好的,我还没有设法取消部署该应用程序,但我已经能够在出现错误时关闭服务器。这并不完美,但与旧版本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) {
  ...
}
这对我们来说是可靠的


在我上面的评论中,我指出执行返回一个错误代码,但这可能是因为我在命令调用中一定有输入错误。

如果我们的DB架构与应用程序的预期不匹配,我们将使用CDI扩展中止部署:

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

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

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

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

@Startup
@Singleton
public class StartupBean {


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

    }
}


谢谢,但我已经尝试使用Runtime.exec调用cli命令关闭服务器,但没有成功。删除dodeploy或部署的标记文件可能有效,但仅适用于部署扫描程序方法。这样,如果已使用管理界面部署应用程序,则无法取消部署该应用程序。不过,谢谢你的建议!
@Startup
@Singleton
public class StartupBean {


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

    }
}