【问题标题】:Refresh Spring Boot Auto-Configured Properties刷新 Spring Boot 自动配置的属性
【发布时间】:2018-11-14 05:47:37
【问题描述】:

我可以动态刷新 Spring Boot 的自动配置设置使用的属性吗?

例如,我设置了以下属性(通过云配置)来自动配置dataSource

spring.datasource.username=user1
spring.datasource.password=test

现在,如果我在配置服务器上更改密码属性,并点击 /refresh 端点,我可以看到更新后的属性已检索,但 DataSource 未刷新。

我知道我可以手动配置 DataSource bean 并确保它们属于 RefreshScope,但我希望找到一种方法将自动配置的属性标记为“可刷新”。我有一些用例,我想刷新 Spring Boot 用于除 DataSources 之外的其他 bean 的道具,并且手动设置其中一些 bean 可能会很痛苦。

【问题讨论】:

  • 我不确定是否将自动配置的属性设为“可刷新”,但您可以尝试推送通知是否适合您。 cloud.spring.io/spring-cloud-config/1.4.x/single/…
  • 如果上面的东西不起作用,你可以在spring cloud config的github页面上提出功能请求。这可能是一个很好的功能。
  • 实际上,推送通知和对/actuator/refresh 端点的请求确实刷新了数据源属性并重新创建了数据库连接。有关详细信息,请参阅下面的答案。

标签: spring spring-boot spring-cloud-config spring-config


【解决方案1】:

我认为我说得太早了,至少就我的DataSource 示例而言。正在使用更新的道具创建新的数据库连接。

这很有意义,尤其是在查看文档时here

这并没有重新连接我拥有的一些 spring.cloud.stream.bindings 属性,但在这种情况下,我可能可以使用 @RefreshScope 解决问题。

【讨论】:

  • 我仍然面临同样的问题。当我尝试记录新的 jdbc url 时,它是属性文件中的新值,但仍然使用旧的 jdbc url 创建数据源。我们是否需要手动刷新/杀死/重新创建数据源 bean?
【解决方案2】:

如果 Autoconfigured bean 是不可变的,需要设置一个配置属性(初始化后不要更改属性)

你可以放一个你需要刷新的类的列表(集合)并且你无法控制源代码,你可以把它们放在属性下:spring.cloud.refresh.extra-refreshable

例如:

spring
  cloud
    refresh
      extra-refreshable:
        - org.springframework.mail.javamail.JavaMailSenderImpl

见:https://cloud.spring.io/spring-cloud-static/Greenwich.SR1/single/spring-cloud.html#refresh-scope

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2016-02-07
    • 2014-12-30
    • 2017-05-23
    • 1970-01-01
    • 2018-03-10
    • 2019-05-19
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多