【问题标题】:How to close spring boot with routing properly如何正确关闭带有路由的弹簧靴
【发布时间】:2020-06-22 09:58:27
【问题描述】:

我正在尝试通过以下代码使用路由来停止我的 Spring Boot 应用程序 与

@GetMapping("/close/")
    fun terminate() {
        exitProcess(0)
    }

但测试服务器有不同的 API,所以我不能使用这段代码(它关闭了整个系统)

我的问题是:how to stop only my spring boot application (replace exitProcess(0))

【问题讨论】:

  • 添加执行器并调用shutdown 端点,而不是自己发明。如果您真的想在应用程序上下文中调用 close。请参阅ShutdownEndpoint,了解 Spring 本身是如何做到的。

标签: spring spring-boot kotlin


【解决方案1】:

例如,您可以使用执行器的关闭来完成此操作。 查找示例here

或者您可以关闭您的应用程序上下文,这样就可以了。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SomeRestController {

    @Autowired
    ApplicationContext applicationContext;

    @GetMapping("/close")
    public void terminate() {
        ((AbstractApplicationContext)applicationContext).close();
    }
}

【讨论】:

  • 是否有另一种方法可以通过路由停止应用程序而不更改配置?
  • 是的,实际上你可以关闭你的 ApplicationContext 并且它会起作用。你只需要沮丧。示例:((AbstractApplicationContext)applicationContext).close();
  • 谢谢,这对我帮助很大。顺便说一句,有没有办法以与((AbstractApplicationContext)applicationContext).close() 相同的方式重新启动应用程序,现在我只在val thread = Thread(Runnable { })thread.isDaemon = falsethread.start() 和你的.close() 中使用context = SpringApplication.run(Application::class.java, *args.sourceArgs),但我不想使用线程,因为测试服务器上的 weblogic 无法控制它,没有线程我的.run 也不会启动应用程序。
  • 您可以使用执行器来执行此操作。或者您可以只运行一个线程来关闭并再次启动您的上下文。您可以查看一个非常好的示例here
猜你喜欢
  • 2018-02-14
  • 1970-01-01
  • 2014-06-27
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2021-02-16
相关资源
最近更新 更多