以编程方式closuresSpring Boot应用程序
如何以编程方式closures Spring Boot应用程序而不终止VM ?
在其他作品中,相反的是什么
new SpringApplication(Main.class).run(args);
closuresSpringApplication
基本上意味着closures底层的ApplicationContext
。 SpringApplication#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()
方法,它有两个参数: ApplicationContext
和ExitCodeGenerator
:
即你可以声明这个方法:
@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 { ...