【问题标题】:Can a deployment stop itself?部署可以自行停止吗?
【发布时间】:2014-05-15 12:57:37
【问题描述】:

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

背景:

  • 应用程序在其启动阶段使用 MBean 进行一些健康检查。
  • 如果应用程序由于缺少某些资源而确定环境无效,则需要停止自己的部署。

原来的样子:

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

当前问题:

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

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

非常感谢!

【问题讨论】:

    标签: java jboss wildfly wildfly-8


    【解决方案1】:

    我认为核心问题是在某些运行状况检查失败时停止部署过程。在应用启动期间抛出运行时异常就足以完成这项工作。

    @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");
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      但无论如何,我不确定服务器的行为方式。例如,当您添加文件myWarName.dodeploy 时会发生什么myWarName.isdeploying。所以让我们知道你什么时候会在这个主题上获得一些经验(这很有趣)。

      【讨论】:

      • 谢谢,但我已经尝试调用 cli 命令以使用 Runtime.exec 关闭服务器,但没有成功。删除 dodeploy 或已部署的标记文件可能有效,但仅适用于部署扫描器方法。这样,如果应用程序已使用管理界面进行部署,您将无法取消部署该应用程序。不过,谢谢你的建议!
      【解决方案3】:

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

      这对我们来说很可靠。

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

      【讨论】:

        【解决方案4】:

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

        class MyValidatingExtension implements javax.enterprise.inject.spi.Extension {
        
            void deploymentValidationFinished(@Observes AfterDeploymentValidation afterDeploymentValidation) {
                if (!stateExpected) {
                    afterDeploymentValidation.addDeploymentProblem(new IDontLikeThisException());
                }
            }
        }
        

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

        【讨论】:

          猜你喜欢
          • 2012-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多