gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:37:12 26 4
gpt4 key购买 nike

relevant zulip chat
我试图弄清楚在 quarkus 应用程序启动期间你应该如何优雅地失败。

  • 我尝试将此添加到应用程序启动代码中。如果我运行其中一个单元测试,现在不会调用它。只有当我直接启动应用程序时才会调用它。我希望返回一个非零值,而不是抛出异常。这可能是推荐的方法。我不确定。
  •     public class MyApp implements QuarkusApplication {

    @Override
    public int run(String... args) throws Exception {
    System.out.println("Do startup logic here");
    Quarkus.waitForExit();
    return 0;
    }
  • 我还尝试从 onStart 生命周期事件中引发异常。但似乎 quarkus 继续执行
  •    void onStart(@Observes StartupEvent ev) {               
    LOGGER.info("The application is starting...");
    }

    void onStop(@Observes ShutdownEvent ev) {
    LOGGER.info("The application is stopping...");
    }
    我不确定这是功能请求错误还是我遗漏了某些东西,这是正常行为。
    编辑1:
    只是要清楚:
    @Startup
    @ApplicationScoped
    public class StarterBean {
    private static final Logger LOGGER = Logger.getLogger("");

    public StarterBean() {
    throw new RuntimeException("failed misrably");
    }
    }
    当我使用“./gradlew quarkusDev”运行时,我在控制台中看到了异常,但应用程序从不存在。我认为它应该。它在单元测试期间确实退出并正确失败。我尝试在 onStart 中移动异常并且确实如此也无济于事。我还尝试了 Startup、ApplicationScoped 或两者的组合
    编辑2:
    我通过构建 uber jar 并运行它来测试它。引发异常确实会退出应用程序。同样可以想象,应用程序在 docker 容器中运行时也会退出。我很困惑为什么 gradle 任务永远不存在。所以为此我想我会接受答案。非常感谢你的帮助 !

    最佳答案

    我不确定这里是否有一个很好的答案可以满足所有要求(如果我错了,很高兴得到纠正。)不确定您要达到的目标,但有一些选项可能值得探索:

  • Quarkus.asyncExit(code)在您的 run()方法将允许您优雅地退出,但这不会被单元测试调用。
  • 您可以在启动时初始化一个 bean(用 @Startup 对其进行注释),它会在其构造函数中引发异常,但这并不是特别优雅,并且不会让您控制状态代码。然而,它似乎返回 -1,因此它至少满足您的非零退出代码标准。 (遗憾的是 Quarkus.asyncExit(code) 似乎不适用于单元测试,即使它是在测试开始之前的 bean 初始化中执行的。)
  • 同上,但您可以调用System.exit()在 bean 构造函数中。这使您可以控制退出代码,但这是最不干净的方法,它只是将 VM 拉走,而没有任何优雅的清理机会。

  • 编辑:刚刚从 zulipchat 线程中看到了这个,它添加了一些必要的上下文:

    I need to be able to bail out during startup if i see certain conditions (for example missing env variables or whatever) how am i supposed to do it ?


    在这种情况下,我可能会声明 @Startup bean(或 bean)基于这些环境变量进行初始化,并确保这些 bean 的构造函数在条件不正确(缺少 env 变量、损坏的 env 变量等)时抛出有意义的异常。这有一些优点:
  • 您可以将适当的启动检查分成不同的 bean,从而实现职责分离;
  • 您有有意义的信息可以在日志中进行分析和操作;
  • 如果由于抛出该异常而导致出现错误,您可以使用非零退出代码有意义地停止,从而允许容器运行状况检查系统报告节点已严重死亡。
  • 关于java - 在启动生命周期中优雅地退出 quarkus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62668246/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com