Java 在启动生命周期中优雅地退出quarkus
我正在试图弄清楚,在quarkus中启动应用程序时,您应该如何优雅地失败Java 在启动生命周期中优雅地退出quarkus,java,quarkus,Java,Quarkus,我正在试图弄清楚,在quarkus中启动应用程序时,您应该如何优雅地失败 我尝试将其添加到应用程序启动代码中。如果我运行一个单元测试,现在就不会调用它。仅当我直接启动应用程序时才会调用它。我希望返回一个非零值,以防抛出异常。这可能是推荐的方法。我不确定 我还尝试从onStart生命周期事件引发异常。但夸克斯似乎继续执行死刑 我不确定这是一个功能请求还是一个bug,或者我遗漏了什么,这是正常的行为 编辑1: 我想说清楚: @Startup @ApplicationScoped public cla
@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(用
注释它),该bean在其构造函数中抛出一个异常,但这并不特别优雅,也不会给您状态代码的控制权。然而,它似乎返回-1,所以它至少满足了非零退出代码的标准。(遗憾的是@startup
似乎不适用于单元测试,即使它是在测试开始之前在bean初始化中执行的。)Quarkus.asyncExit(code)
- 如上所述,但您可以在bean构造函数中调用
。这让您可以控制退出代码,但这是最不干净的方法,它只是简单地将VM拖走,没有任何清理的机会System.exit()
@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");
}
}