以编程方式关闭Spring Boot应用程序

Axe*_*ine 91 java spring spring-boot

如何在不终止VM的情况下以编程方式关闭Spring Boot应用程序?

在其他作品中,与之相反

new SpringApplication(Main.class).run(args);
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 92

关闭SpringApplication基本上意味着关闭基础ApplicationContext.该SpringApplication#run(String...)方法将您ApplicationContext作为一个ConfigurableApplicationContext.你可以close()自己做吧.例如,

@SpringBootApplication
public class Example {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
        // ...determine it's time to shut down...
        ctx.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用static SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)辅助方法为您执行此操作.例如,

@SpringBootApplication
public class Example {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
        // ...determine it's time to stop...
        int exitCode = SpringApplication.exit(ctx, new ExitCodeGenerator() {
            @Override
            public int getExitCode() {
                // no errors
                return 0;
            }
        });

        // or shortened to
        // int exitCode = SpringApplication.exit(ctx, () -> 0);

        System.exit(exitCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Denys不,上下文在关闭时不会退出java进程。我的示例中的退出仅演示了如何使用“ExitCodeGenerator”。您只需从“main”方法返回即可正常退出(退出代码 0)。 (2认同)

sno*_*lli 55

在Spring启动应用程序中,您可以使用类似的东西

ShutdownManager.java

import org.springframework.context.ApplicationContext;
import org.springframework.boot.SpringApplication;

@Component
class ShutdownManager{

    @Autowired
    private ApplicationContext appContext;

    public void initiateShutdown(int returnCode){
        SpringApplication.exit(appContext, () -> returnCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Upvote表示`ApplicationContext`可以自动注入其他bean. (7认同)

ACV*_*ACV 31

这项工作,甚至完成印刷.

  SpringApplication.run(MyApplication.class, args).close();
  System.out.println("done");
Run Code Online (Sandbox Code Playgroud)

所以加入.close()之后run()

说明:

public ConfigurableApplicationContext run(String... args)

运行Spring应用程序,创建并刷新新的ApplicationContext.参数:

args - 应用程序参数(通常从Java main方法传递)

返回: 正在运行的ApplicationContext

和:

void close()关闭此应用程序上下文,释放实现可能包含的所有资源和锁.这包括销毁所有缓存的单例bean.注意:不在父上下文上调用close; 父语境有自己独立的生命周期.

可以多次调用此方法而不会产生副作用:将忽略对已经关闭的上下文的后续关闭调用.

所以基本上,它不会关闭父上下文,这就是VM不退出的原因.

  • 只是提醒一下,此解决方案适用于批处理等短期进程,但不要在 Spring MVC 应用程序上使用它。该应用程序在启动后刚刚关闭。 (2认同)

Sam*_*Sam 9

这将确保 SpringBoot 应用程序正确关闭并将资源释放回操作系统,

@Autowired
private ApplicationContext context;

@GetMapping("/shutdown-app")
public void shutdownApp() {

    int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
    System.exit(exitCode);
}
Run Code Online (Sandbox Code Playgroud)