java – 以编程方式重新启动Spring Boot应用程序/刷新Spring Context

我试图以编程方式重新启动我的Spring应用程序,而无需用户进行干预.

基本上,我有一个页面,允许切换应用程序的模式(实际上意味着切换当前活动的配置文件),据我所知,我必须重新启动上下文.

目前我的代码非常简单,它只是用于重启位(顺便说一下,这是Kotlin):

    context.close()
    application.setEnvironment(context.environment)
    ClassUtils.overrideThreadContextClassLoader(application.javaClass.classLoader)
    context = application.run(*argsArray)

但是,当我执行context.close()时,JVM立即存在.我也尝试过context.refresh(),但这似乎只是简单地杀死了Tomcat / Jetty(只是在它是一个Tomcat问题的情况下尝试过)然后没有任何反应.

我也见过Programmatically restart Spring Boot application,但似乎从这些答案中找不到任何东西.此外,我查看了Spring Actuator,它应该具有/ restart端点,但那似乎不再存在了?

非常感谢帮助.谢谢.

最佳答案
即使Alex的解决方案有效,我也不相信包含2个额外的依赖项(Actuator和Cloud Context)只是为了能够执行一个操作.相反,我结合他的答案和修改我的代码,以做我想要的.

因此,首先,使用新的Thread()和setDaemon(false);执行代码至关重要.我有以下端点方法来处理重启:

val restartThread = Thread {
    logger.info("Restarting...")
    Thread.sleep(1000)
    SpringMain.restartToMode(AppMode.valueOf(change.newMode.toUpperCase()))
    logger.info("Restarting... Done.")
}
restartThread.isDaemon = false
restartThread.start()

Thread.sleep(1000)不是必需的,但我希望我的控制器在实际重新启动应用程序之前输出视图.

SpringMain.restartToMode具有以下内容:

@Synchronized fun restartToMode(mode: AppMode) {
    requireNotNull(context)
    requireNotNull(application)

    // internal logic to potentially produce a new arguments array

    // close previous context
    context.close()

    // and build new one using the new mode
    val builder = SpringApplicationBuilder(SpringMain::class.java)
    application = builder.application()
    context = builder.build().run(*argsArray)
}

在启动应用程序时,上下文和应用程序来自主要方法:

val args = ArrayList<String>()
lateinit var context: ConfigurableApplicationContext
lateinit var application: SpringApplication

@Throws(Exception::class)
@JvmStatic fun main(args: Array<String>) {
    this.args += args

    val builder = SpringApplicationBuilder(SpringMain::class.java)
    application = builder.application()
    context = builder.build().run(*args)
}

我不完全确定这是否会产生任何问题.如果有,我会更新这个答案.希望这对其他人有任何帮助.

转载注明原文:java – 以编程方式重新启动Spring Boot应用程序/刷新Spring Context - 代码日志