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

从Shell脚本优雅地关闭Spring Boot应用程序

都建树
2023-03-14

我有一个使用可执行jar文件运行的Spring Boot应用程序。目前,为了停止服务,我们只是扼杀了进程。我看到我们可以使用以下方法优雅地关闭应用程序。

ApplicationContext ctx = SpringApplication.run(Application.class, args);

然后我可以在代码的某个地方调用ctx.close()或者我们可以使用下面的静态方法。

SpringApplication.exit(ApplicationContext, ExitCodeGenerator)

它目前适用于我们,但我们实际上是在一个控制器内部调用这个ctx.close()方法,如下所示。

@RequestMapping("/shutdownSpringBoot")
public void shutdownApplication() {
    MyApplication.ctx.close(); // I'm saving the context returned by spring boot in a static variable inside my main class
}

当我们通过http访问这个controller方法时,应用程序将正常关闭。但我们不想这样做。是否可以编写一个shell/batch脚本来触发java类,我可以在其中调用ctx.close()方法?我们正在寻找一个类似于我们从独立的tomcat容器(shutdown.bat/shutdown.sh)中获得的关闭脚本,这样我们就可以将应用程序作为一个jar文件提供给我们的客户,他们可以通过执行这些脚本来启动或停止应用程序。(他们已经习惯了)。

谢谢,桑杰

共有1个答案

艾正浩
2023-03-14

我认为您可以通过检查命令行参数来检测是否将jar作为命令行实用程序运行,而不是加载整个Spring上下文和启动web应用程序,您只需使用内置Java HTTP客户端HTTP访问本地shutdownSpringbootURL。

 类似资料:
  • 优雅关闭,包括两部分,一个是 RPC 框架作为客户端,一个是 RPC 框架作为服务端。 作为服务端 作为服务端的时候,RPC 框架在关闭时,不应该直接暴力关闭。在 RPC 框架中 com.alipay.sofa.rpc.context.RpcRuntimeContext 在静态初始化块中,添加了一个 ShutdownHook // 增加jvm关闭事件 if (RpcConf

  • 在我的webapp中,我创建了一个使用具有固定大小线程池的的服务。我在整个应用程序生命周期中重用相同的。 All在Tomcat中运行,在关闭时出现以下错误: 我确实意识到在关闭tomcat之前需要关闭ExecutorService。Soms所以线程已经谈到了这一点,但我找不到一个干净的方法来处理这一点。 我是否应该使用,就像@tim-bender建议的那样,在优雅地关闭线程和执行器?还是应该使用C

  • Dorado的优雅关闭通过ShutDownHook方式实现,调用端和服务端通过添加hook进行资源的清理和关闭 protected synchronized void addShutDownHook() { if (hook == null) { hook = new ShutDownHook(this); Runtime.getRuntime().addS

  • 我有一个应用程序运行在嵌入式jetty服务器上。现在我想将服务器作为服务启动/停止。我使用一个脚本来启动服务器。

  • 我在Spring Boot应用程序中有两条路由(路由1和路由2)。我一直在研究如何在处理这两条路由后优雅地关闭应用程序。我参考了文档(https://camel.apache.org/manual/latest/gracefule-shutdown.html),但无法成功实现所需的功能。也许我的理解是错误的。 下面是我的两条路线 路线1 路线2 它会优雅地关闭两条路由,但随后会警告强制关闭Exec

  • Graceful shutdown When you deploy a new version of your application, you must replace the previous version. The process manager you’re using will first send a SIGTERM signal to the application to noti