我们有一个spring boot web应用程序,我们从一个修改的、扩展的start命令开始,类似于:
java -classpath "..." -Dlogging.config="..." org.springframework.boot.loader.JarLauncher --debug --spring.config.location="..."
现在,我们需要通过编程(例如通过端点)重新启动这个应用程序,但是我们需要确保“使用相同的启动命令”。
我在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应用程序参数提取程序参数。
到目前为止,我还没有找到一种方法来对vm参数和类路径的扩展执行相同的操作,如上面的命令所示。
这有可能吗?有没有一种更方便的方法来重新启动一个spring启动应用程序,同时考虑到所有这些要求?
1条答案
按热度按时间tkclm6bt1#
您在教程中找到的方法不会重新启动整个jvm进程,而是关闭应用程序上下文并重新创建它。这意味着所有bean都将再次加载,这在逻辑上等同于重新启动,因为所有对象都由spring或course管理。
还有一种方法可以在不编写自定义代码的情况下重新启动—使用SpringBoot的执行器,它具有
restart
终结点。您可以调用端点,应用程序将以与您描述的相同的方式重新启动。请参阅本教程,例如还有许多其他教程。在这两种方式中,将有相同的jvm进程(jvm不会重新启动),因此类路径和jvm参数将保持不变(不更改)。
因此,如果您想重新启动jvm,可以将长命令 Package 成某种脚本(例如,在linux上使用bash,或者在windows上使用*.bat文件)。
除此之外,spring引导也帮不了什么忙——从这个Angular 来看,它是一个常规的java应用程序。