2014-09-24 184 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中的條目)在可用時提供位置。