我在这里阅读了Spring Boot参考指南
可以在Spring Boot应用程序上以编程方式设置ApplicationPidListener . 这很棒,但我当然希望多一点 .
当我按照参考指南设置ApplicationPidListener时
app.addListeners(new ApplicationPidListener(pidFileName));
然后像这样启动应用程序
app.run(arguments.toArray(new String[arguments.size()]))
于是我发现任何可能已用于实例化ApplicationPidListener pid文件位置的命令行覆盖属性都不可用 . 当然,我可以自己解析命令行参数,寻找应该用于实例化ApplicationPidListener的属性,但我宁愿不这样做 .
如果我可以像这样在Java配置中将ApplicationPidListener作为Bean提供,那么我的问题也许可以解决
@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文件 .
我的问题是我在编程运行时以编程方式限制添加侦听器,这意味着我必须查看命令行参数以查看是否有pid文件覆盖?
谢谢 .
1 回答
是的,你是 . 目前
ApplicationPidListener
将PID写出来以响应ApplicationStartedEvent
. 此事件在应用程序的生命周期的早期发布 . 来自javadoc:这可以防止
ApplicationPidListener
被配置为Spring bean . 有一个open issue讨论了使pid文件的位置可配置 . 当前的提议是使被监听的事件可配置并使用Environment
(例如application.properties
或application.yaml
中的条目),以便提供该位置 .