Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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 在启动生命周期中优雅地退出quarkus_Java_Quarkus - Fatal编程技术网

Java 在启动生命周期中优雅地退出quarkus

Java 在启动生命周期中优雅地退出quarkus,java,quarkus,Java,Quarkus,我正在试图弄清楚,在quarkus中启动应用程序时,您应该如何优雅地失败 我尝试将其添加到应用程序启动代码中。如果我运行一个单元测试,现在就不会调用它。仅当我直接启动应用程序时才会调用它。我希望返回一个非零值,以防抛出异常。这可能是推荐的方法。我不确定 我还尝试从onStart生命周期事件引发异常。但夸克斯似乎继续执行死刑 我不确定这是一个功能请求还是一个bug,或者我遗漏了什么,这是正常的行为 编辑1: 我想说清楚: @Startup @ApplicationScoped public cla

我正在试图弄清楚,在quarkus中启动应用程序时,您应该如何优雅地失败

  • 我尝试将其添加到应用程序启动代码中。如果我运行一个单元测试,现在就不会调用它。仅当我直接启动应用程序时才会调用它。我希望返回一个非零值,以防抛出异常。这可能是推荐的方法。我不确定
  • 我还尝试从onStart生命周期事件引发异常。但夸克斯似乎继续执行死刑
  • 我不确定这是一个功能请求还是一个bug,或者我遗漏了什么,这是正常的行为

    编辑1: 我想说清楚:

    @Startup
    @ApplicationScoped
    public class StarterBean {
        private static final Logger LOGGER = Logger.getLogger("");
    
        public StarterBean() {
            throw new RuntimeException("failed misrably");
        }
    }
    
    当我使用“/gradlew quarkusDev”运行时,我在控制台中看到异常,但应用程序从不存在。我认为它应该存在。它确实在单元测试期间退出,并正常失败。我尝试在onStart中移动异常,但也没有帮助。我还尝试了启动、应用程序或两者的组合

    编辑2:

    我通过构建uber jar并运行它来测试它。引发异常确实会退出应用程序。正如人们可以想象的那样,应用程序在docker容器中运行时也会退出。我很困惑为什么gradle任务永远不存在。因此,为此我想我会接受答案。非常感谢您的帮助!

    我不确定是否存在在这里,e是一个很好的答案,它满足了所有的要求(如果我错了,很高兴被纠正)。不确定您想要实现什么,但有几个选项可能值得探索:

    • run()
      方法中的
      Quarkus.asyncExit(code)
      将允许您优雅地退出,但单元测试不会调用它
    • 您可以在启动时初始化一个bean(用
      @startup
      注释它),该bean在其构造函数中抛出一个异常,但这并不特别优雅,也不会给您状态代码的控制权。然而,它似乎返回-1,所以它至少满足了非零退出代码的标准。(遗憾的是
      Quarkus.asyncExit(code)
      似乎不适用于单元测试,即使它是在测试开始之前在bean初始化中执行的。)
    • 如上所述,但您可以在bean构造函数中调用
      System.exit()
      。这让您可以控制退出代码,但这是最不干净的方法,它只是简单地将VM拖走,没有任何清理的机会
    编辑:刚刚从zulipchat线程中看到这一点,它添加了一些必要的上下文:

    我需要能够在启动过程中摆脱困境,如果我看到某些情况(例如缺少环境变量或其他),我该怎么做

    在这种情况下,我可能会声明一个
    @Startup
    bean(或多个bean)以基于这些环境变量进行初始化,并确保这些bean的构造函数在条件不正确(缺少环境变量、损坏的环境变量等)时抛出有意义的异常,这有一些优点:

    • 您可以将适当的启动检查分离为不同的bean,强制执行职责分离
    • 您可以在日志中分析和处理有意义的信息
    • 如果抛出该异常导致出现问题,则可以使用非零退出代码有意义地停止,从而允许容器healthcheck系统报告节点严重死亡
       void onStart(@Observes StartupEvent ev) {               
            LOGGER.info("The application is starting...");
        }
    
        void onStop(@Observes ShutdownEvent ev) {               
            LOGGER.info("The application is stopping...");
        }
    
    @Startup
    @ApplicationScoped
    public class StarterBean {
        private static final Logger LOGGER = Logger.getLogger("");
    
        public StarterBean() {
            throw new RuntimeException("failed misrably");
        }
    }