spring 以编程方式重新启动Sping Boot 应用程序

exdqitrt  于 2022-11-21  发布在  Spring
关注(0)|答案(4)|浏览(184)

我正在使用Sping Boot ,我有一个用例,其中用户可以上传一个文件,这应该会导致应用程序重启(因为用户的上传是在创建多个bean期间使用的)。我知道我可以避免重启应用程序,但目前-这是我想要的。
我在Spring-Cloud项目中发现了RestartEndpoint,但是它似乎没有被激发。有没有其他方法可以通过编程重新启动 Boot 应用程序?

o4hqfura

o4hqfura1#

最简单的方法是在Spring ApplicationContext上调用refresh()方法。这将终止并重新加载所有bean,因此您应该确保仅在应用程序安全的情况下才执行此操作。

wribegjk

wribegjk2#

我有一个特殊的情况,其中我的Sping Boot 应用程序(在Linux上运行)需要作为root运行。
由于我将应用程序作为systemd服务运行,因此可以如下所示重新启动它:

Runtime.getRuntime().exec(new String[] { "/bin/systemctl", "restart", "foo" });

如果您的应用程序(希望如此)不需要以root运行,则可以使用setuid Package 脚本,或者更好地使用sudo
请检查以下答案,了解如何做到这一点:
https://superuser.com/questions/440363/can-i-make-a-script-always-execute-as-root

6yt4nkrj

6yt4nkrj3#

在您的情况下,可能可以使用/refresh端点(请参阅http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_endpoints),并以@RefreshScope注解相依于已变更设定的Bean。

wqlqzqxt

wqlqzqxt4#

我使用下面的代码从代码本身重新启动我的应用程序。使用单独的线程关闭上下文不会关闭JVM。

public class DemoApplication {

private static String[] args;
private static ConfigurableApplicationContext context;

public static void main(String[] args) {
    DemoApplication.args = args;
    context = SpringApplication.run(DemoApplication.class, args);
}

public static void restart() {
  
    Thread thread = new Thread(() -> {
        context.close();            
        context = SpringApplication.run(DemoApplication.class, DemoApplication.args);
    });
    thread.setDaemon(false);
    thread.start();
}

相关问题