我试图弄清楚在 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;
}
Run Code Online (Sandbox Code Playgroud)
void onStart(@Observes StartupEvent ev) {
LOGGER.info("The application is starting...");
}
void onStop(@Observes ShutdownEvent ev) {
LOGGER.info("The application is stopping...");
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是一个功能请求错误或者我遗漏了一些东西,这是正常行为。
编辑1:只是为了清楚:
@Startup
@ApplicationScoped
public class StarterBean {
private static final Logger LOGGER = Logger.getLogger("");
public StarterBean() {
throw new RuntimeException("failed misrably");
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用“./gradlew quarkusDev”运行时,我在控制台中看到异常,但应用程序从未存在。我认为它应该存在。它确实在单元测试期间退出并正确失败。我尝试在 onStart 中移动异常,结果确实如此也没有帮助。我还尝试了 Startup、ApplicationScoped 或两者的组合
编辑2:
我通过构建 uber jar 并运行它来测试它。引发异常确实会退出应用程序。同样可以想象,应用程序在 docker 容器中运行时也会退出。我很困惑为什么 gradle 任务从来不存在。因此,为此我想我会接受答案。非常感谢你的帮助 !
我不确定这里是否有一个很好的答案可以满足所有要求(如果我错了,很高兴得到纠正。)不确定您到底想要实现什么,但有一些选项可能值得探索:
Quarkus.asyncExit(code)在你的run()方法中将允许你优雅地退出,但这不会被单元测试调用。@Startup),并在其构造函数中抛出异常,但这并不是特别优雅,并且无法让您控制状态代码。但它似乎确实返回 -1,因此它至少满足您的非零退出代码标准。(遗憾的Quarkus.asyncExit(code)是,它似乎不适用于单元测试,尽管它是在测试开始之前在 bean 初始化中执行的。)System.exit()在 bean 构造函数中调用。这使您可以控制退出代码,但这是最不干净的方法,它只是将虚拟机拉走,而没有任何优雅的清理机会。编辑:刚刚从 zulipchat 线程中看到了这一点,它添加了一些必要的上下文:
如果我看到某些条件(例如缺少环境变量或其他什么),我需要能够在启动过程中退出,我该怎么做?
在这种情况下,我可能会声明一个@Startup(或多个)bean 来根据这些环境变量进行初始化,并确保这些 bean 的构造函数在条件不正确时抛出有意义的异常(缺少环境变量、损坏的环境变量等) .) 这有几个优点:
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |