首页 文章

Spring Boot ApplicationPidListener的Java配置

提问于
浏览
1

我在这里阅读了Spring Boot参考指南

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

可以在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 回答

  • 3

    我是否以编程方式限制在调用run之前添加侦听器?

    是的,你是 . 目前 ApplicationPidListener 将PID写出来以响应 ApplicationStartedEvent . 此事件在应用程序的生命周期的早期发布 . 来自javadoc

    在SpringApplication启动之前尽可能早地发布事件 - 在环境或ApplicationContext可用之前,但在ApplicationListeners注册之后

    这可以防止 ApplicationPidListener 被配置为Spring bean . 有一个open issue讨论了使pid文件的位置可配置 . 当前的提议是使被监听的事件可配置并使用 Environment (例如 application.propertiesapplication.yaml 中的条目),以便提供该位置 .

相关问题