我们有一个spring boot web应用程序,我们用一个经过修改的、扩展的启动命令启动,如下所示:
java -classpath "..." -Dlogging.config="..." org.springframework.boot.loader.JarLauncher --debug --spring.config.location="..."现在,我们需要以编程方式(例如,通过端点)重新启动此应用程序,但我们需要确保“使用相同的启动命令”。
我找到了这个solution on bealdung
@SpringBootApplication
public class Application {
private static ConfigurableApplicationContext context;
public static void main(String[] args) {
context = SpringApplication.run(Application.class, args);
}
public static void restart() {
ApplicationArguments args = context.getBean(ApplicationArguments.class);
Thread thread = new Thread(() -> {
context.close();
context = SpringApplication.run(Application.class, args.getSourceArgs());
});
thread.setDaemon(false);
thread.start();
}
}在这种情况下,可以使用bean ApplicationArguments提取程序参数。
到目前为止,我还没有找到一种方法来对VM参数和上面的命令中看到的类路径扩展执行相同的操作。
这有可能吗?考虑到所有这些要求,有没有一种更方便的方法来重启spring boot应用程序?
发布于 2021-04-07 19:35:48
您在教程中找到的方法不会重新启动整个JVM进程,它会关闭应用程序上下文并重新创建它。这意味着所有bean都会再次加载,这在逻辑上等同于重新启动,因为所有对象都是由Spring或course管理的。
还有一种方法可以在不编写自定义代码的情况下进行这样的重启-使用Spring Boot的执行器,它有一个restart端点。您可以调用端点,应用程序将以与您所描述的相同的方式重新启动。请看this tutorial for example,还有很多其他的。
在这两种方式中,都将有相同的JVM进程(jvm不会重新启动),因此类路径和JVM参数将保持不变(不更改)。
因此,如果你想重新启动JVM,你可以把这个长命令打包成某种脚本(比如bash,如果你在linux上工作,或者*.bat文件在windows上)。
除此之外,spring boot帮不了什么忙--从这个角度来看,它是一个普通的java应用程序。
https://stackoverflow.com/questions/66984863
复制相似问题