2014-09-24 182 views
1

的Java的配置我的春天引导参考指南中读到这里春季启动ApplicationPidListener

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#production-ready-process-monitoring

,一个ApplicationPidListener可以在春季启动的应用程序进行编程设置。这很好,但我想再多一点。

当我设置ApplicationPidListener每参考指南这样

 

app.addListeners(new ApplicationPidListener(pidFileName)); 
 

随后象这样启动

 

app.run(arguments.toArray(new String[arguments.size()])) 
 

该应用于是我obseved该特性的任何命令行覆盖不可用的是可能已被用于实例化ApplicationPidListener pid文件位置。当然,我可以自己解析命令行参数,查找应该用来实例化ApplicationPidListener的属性,但我宁愿不这样做。

我的问题或许可以解决,如果我能提供ApplicationPidListener作为一个Bean在Java配置这样

 

    @Configuration 
    public static class TestConfig { 
     @Bean 
     public ApplicationListener pidListener(@Value("${pidFile:app.pid}") String prop) { 
      return new ApplicationPidListener(prop); 
     } 
    } 
 

,并通过configurationSources.toArray提供这种配置的SpringApplication的构造函数()

 

new SpringApplication(null, configurationSources.toArray()) 
 

通过这种方式,ApplicationPidListener可以全面了解Spring Boot解析的属性,包括命令行覆盖。但是,即使此Config导致创建Bean,当然,它显然不会被应用程序上下文用于创建PID文件。

我的问题是我在编程时被限制为在调用run之前添加侦听器,这意味着我必须查看命令行参数以查看是否存在pid文件覆盖?

谢谢。

+0

你为什么不简单地合并命令行参数和你的'配置资源'包含什么?无论如何,这些'configurationSources'是什么?为什么你需要其他的东西不能用默认的Spring Boot配置支持来实现? – 2014-09-24 05:54:06

+0

这是一个类似模板的应用程序,在配置SpringApplication和调用SpringApplication.run()之上具有构建器层。构建器层的存在是为了让新的微服务开发人员不必非常详细地了解Spring Boot配置。 – ae6rt 2014-09-24 08:41:10

回答

3

我的程序限制在调用run之前添加侦听器吗?

是的,你是。此时ApplicationPidListener将PID写入以响应ApplicationStartedEvent。此事件在应用程序生命周期的早期发布。从javadoc:只要一个SpringApplication已经起步早可以想到出版

事件 - 之前EnvironmentApplicationContext是可用的,但经过ApplicationListener■找注册

这样可防止ApplicationPidListener被配置为Spring bean。有一个open issue讨论使pid文件的位置可配置。当前的建议是使得侦听的事件可配置,并使用Environment(例如,在application.propertiesapplication.yaml中的条目)在可用时提供位置。