Java 弹簧启动同步发射器

Java 弹簧启动同步发射器,java,spring,spring-boot,Java,Spring,Spring Boot,默认情况下,org.springframework.boot.loader.Launcher将始终在launch()方法()中生成一个后台线程。有没有简单的方法可以将此更改为在同一线程中执行,这样我的服务启动器就可以知道应用程序何时已完全加载,而不是每次都立即成功退出。我相信您可以像这样注册侦听器: public static void main(String[] args) { SpringApplication app = new SpringApplication(WsBootCli

默认情况下,org.springframework.boot.loader.Launcher将始终在launch()方法()中生成一个后台线程。有没有简单的方法可以将此更改为在同一线程中执行,这样我的服务启动器就可以知道应用程序何时已完全加载,而不是每次都立即成功退出。

我相信您可以像这样注册侦听器:

public static void main(String[] args) {
   SpringApplication app = new SpringApplication(WsBootClientApplication.class);

   app.addListeners(new ApplicationListener<ContextStartedEvent>() {
      @Override
      public void onApplicationEvent(ContextStartedEvent event) {
         //do your stuff
      }
   });
   app.run(args);
}
publicstaticvoidmain(字符串[]args){
SpringApplication app=新的SpringApplication(WsBootClientApplication.class);
app.addListeners(新的ApplicationListener(){
@凌驾
ApplicationEvent(ContextStartedEvent事件)上的公共无效{
//做你的事
}
});
应用程序运行(args);
}

如果ContextStartedEvent不是适合您的事件,您可以用ApplicationEvent替换ContextStartedEvent。这更通用,将处理应用程序可以侦听的所有上下文生命周期事件。

查看它,您可以使用自己的实现,扩展jarlauncher/warlauncher类并重写launch方法。是的,我知道我可以轻松重写该方法。问题是spring boot不允许为jar启动方法使用不同的mainClass。如果不生成新的
线程
,则无法设置上下文类加载器,因此如果尝试更改此方法,可能会遇到麻烦。您的“服务启动器”实际上在做什么?它是Microsoft Windows服务的启动器。默认情况下,它会等待主方法完成,以发出服务“启动”的信号,并且主方法中的任何异常(例如spring上下文启动失败)都会导致java.exe中的退出代码1,这将发出服务未正确启动的信号。因为线叉,我错过了这两件事。