以编程方式closuresSpring Boot应用程序

如何以编程方式closures Spring Boot应用程序而不终止VM

在其他作品中,相反的是什么

new SpringApplication(Main.class).run(args); 

closuresSpringApplication基本上意味着closures底层的ApplicationContextSpringApplication#run(String...)方法为您提供了ApplicationContext作为ConfigurableApplicationContext 。 你可以自己close()

或者,您可以使用static SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)辅助方法为您做。

这工作,甚至完成打印。

  SpringApplication.run(MyApplication.class, args).close(); System.out.println("done"); 

所以在run()之后添加.close() run()

说明:

public ConfigurableApplicationContext run(String... args)

运行Spring应用程序,创build并刷新一个新的ApplicationContext。 参数:

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

返回: 正在运行的ApplicationContext

和:

void close()closures这个应用程序上下文,释放实现可能持有的所有资源和锁。 这包括销毁所有caching的单身豆。 注意:不在父上下文上调用close; 父上下文有自己独立的生命周期。

这个方法可以被多次调用,而不会产生副作用:在已经closures的上下文中的后续closures调用将被忽略。

所以基本上,它不会closures父上下文,这就是为什么虚拟机不会退出。

在一个弹簧启动应用程序,你可以使用这样的东西

ShutdownManager.java

 import org.springframework.context.ApplicationContext; import org.springframework.boot.SpringApplication; class ShutdownManager{ @Autowired private ApplicationContext appContext; public void initiateShutdown(int returnCode){ SpringApplication.exit(appContext, () -> returnCode); } } 

在应用程序中,您可以使用SpringApplication 。 这有一个静态的exit()方法,它有两个参数: ApplicationContextExitCodeGenerator

即你可以声明这个方法:

 @Autowired public void shutDown(ExecutorServiceExitCodeGenerator exitCodeGenerator) { SpringApplication.exit(applicationContext, exitCodeGenerator); } 

在集成testing中,您可以通过在类级别添加@DirtiesContext注释来实现它:

  • @DirtiesContext(classMode=ClassMode.AFTER_CLASS) – 在testing类之后,相关的ApplicationContext将被标记为dirty。
  • @DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD) – 在类中的每个testing方法之后,相关联的ApplicationContext将被标记为脏。

 @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {Application.class}, webEnvironment= SpringBootTest.WebEnvironment.DEFINED_PORT, properties = {"server.port:0"}) @DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_CLASS) public class ApplicationIT { ...