Spring Boot 同步启动器

Posted

技术标签:

【中文标题】Spring Boot 同步启动器【英文标题】:Spring Boot synchronous launcher 【发布时间】:2015-02-26 22:50:48 【问题描述】:

org.springframework.boot.loader.Launcher 默认总是在 launch() 方法中产生一个后台线程 (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/Launcher.java#L105)。是否有任何简单的方法可以将其更改为在同一线程中执行,以便我的服务启动器可以知道应用程序何时完全加载,而不是每次都立即成功退出。

【问题讨论】:

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

我相信你可以像这样注册监听器:

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);

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

【讨论】:

以上是关于Spring Boot 同步启动器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot的启动器Starter详解

[转]Spring Boot的启动器Starter详解

修改 Spring boot 启动端口号 Spring Boot 监听端口被占用无法启动

Spring Boot启动过程:Spring Boot内嵌Tomcat启动

Spring Boot的启动器Starter详解

启动spring boot报错,怎么解决