当前位置: 首页 > 知识库问答 >
问题:

在启动生命周期中优雅地退出夸克

倪举
2023-03-14

相关zulip聊天

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

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

        @Override
        public int run(String... args) throws Exception {
            System.out.println("Do startup logic here");
            Quarkus.waitForExit();
            return 0;
        }
   void onStart(@Observes StartupEvent ev) {               
        LOGGER.info("The application is starting...");
    }

    void onStop(@Observes ShutdownEvent ev) {               
        LOGGER.info("The application is stopping...");
    }

我不确定这是一个功能请求还是一个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容器中运行时也会退出。我不明白为什么格拉德尔任务根本不存在。为此,我想我会接受答案。非常感谢你的帮助!

共有1个答案

丰辰沛
2023-03-14

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

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

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

我需要能够在启动期间保释,如果我看到某些条件(例如缺少环境变量或其他)我应该怎么做?

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

  • 您可以将适当的启动检查分离为不同的bean,强制执行职责分离

 类似资料:
  • 问题内容: 我正在阅读出色的在线书籍http://nodebeginner.org/,并尝试了简单的代码 现在我不知道(而且我仍然不知道!)如何优雅地关闭node.js,所以我就去了。现在,每次我尝试运行时,都会收到以下错误消息。 因此,有两个问题: 1)如何正常关闭node.js? 2)如何修复我创建的混乱? 问题答案: 使用+ 优雅地退出节点进程 清理混乱取决于您的平台,但基本上,您需要找到运

  • 我有一个顶级核心.异步运行循环。我想让它无限期地运行,至少直到我用CTRL-C或kill或类似的方式示意它停止。我当前正在使用java.lang.runtime/AddShutDownHook,如下所示: 我想要的也不是。 我不一定期望找到一个适用于所有JVM的解决方案。我在Mac上开发并部署到Ubuntu上,所以我想找到一个同时适用于两者的解决方案: > Mac JVM:java版本“1.7.0

  • 遵循本指南:https://quarkus.io/guides/building-native-image 为此,Quarkus通过利用容器运行时(如Docker或podman)提供了创建本地Linux可执行文件的非常方便的方法。完成此任务的最简单方法是执行:./mvnw package-Pnative-Dquarkus.native.container build=true 我收到此错误:[er

  • 注:本文档提供的生命周期指的是 Universal App 的生命周期,它依赖 rax-app 提供的 runApp方法。 App 级生命周期 launch  在 App 启动时触发 使用生命周期 你可以使用 rax-app 提供的 useAppLaunch 来注册 App 级别的生命周期。 示例: import { useAppLaunch } from 'rax-app'; useAppLa

  • 我们大致为WebAPplication设计了4个生命周期: 请求初始化其实就是从URL中解析提取出{module}, {action}, {method}; 然后再根据{module}, {action}, {method}找到对应的Controller文件; 然后再调用对应的{method},完了之后再发送响应。当然响应的过程中肯定是要顺带着解析下模板标签啦。 恩,这就完了,貌似感觉很简单啊。

  • 如下图. 可以看出,基本周期是: created mounted updated (update 可以理解成人肉手动操作触发) destroyed 上面步骤中的 1,3,4都是自动触发。 每个步骤都有对应的 beforeXyz方法 所以, 我们一般使用mounted 作为页面初始化时执行的方法