spring引导:以编程方式重新启动,包括vm和程序参数以及类路径

uqdfh47h  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(254)

我们有一个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启动应用程序,同时考虑到所有这些要求?

tkclm6bt

tkclm6bt1#

您在教程中找到的方法不会重新启动整个jvm进程,而是关闭应用程序上下文并重新创建它。这意味着所有bean都将再次加载,这在逻辑上等同于重新启动,因为所有对象都由spring或course管理。
还有一种方法可以在不编写自定义代码的情况下重新启动—使用SpringBoot的执行器,它具有 restart 终结点。您可以调用端点,应用程序将以与您描述的相同的方式重新启动。请参阅本教程,例如还有许多其他教程。
在这两种方式中,将有相同的jvm进程(jvm不会重新启动),因此类路径和jvm参数将保持不变(不更改)。
因此,如果您想重新启动jvm,可以将长命令 Package 成某种脚本(例如,在linux上使用bash,或者在windows上使用*.bat文件)。
除此之外,spring引导也帮不了什么忙——从这个Angular 来看,它是一个常规的java应用程序。

相关问题