虽然Alex的解决方案有效,但我不认为为了执行一个操作就要包括2个额外的依赖项(Actuator
和Cloud Context
)。相反,我将他的答案与修改后的代码结合起来以实现我想要的功能。
因此,首先,非常关键的是使用new 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)
context.close()
val builder = SpringApplicationBuilder(SpringMain::class.java)
application = builder.application()
context = builder.build().run(*argsArray)
}
当应用程序启动时,context
和application
从main
方法中获取:
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)
}
我不完全确定这是否会造成任何问题。如果有的话,我会更新这个答案。希望这能对其他人有所帮助。