【问题标题】:Using hostname in ConditionalOnProperty annotation在 ConditionalOnProperty 注释中使用主机名
【发布时间】:2018-08-02 14:16:07
【问题描述】:

我们有一个进行状态检查的@Scheduled 进程。但由于它在一组服务器上运行并为每个服务器提供相同的信息,因此我们会收到 5 条冗余消息。

为了解决这个问题,我发现@ConditionalOnProperty 在我的开发盒上运行良好,我的主机名硬编码为havingValue 属性并在application-dev.yml 中设置statusHost 属性。这似乎是一个很好的设置,因为它在它们匹配时运行,而在它们不匹配时不运行。还有一个好处是,如果 yml 没有该属性,它就不会在该环境的任何服务器上运行。

所以它在代码中看起来像这样:

@Component
@ConditionOnProperty(prefix="status.", value="host", havingValue="my-dev-box")
public class StatusChecker {}

还有 yml:

status:
  host: my-dev-box

不幸的是,当我去清理并放入正确的东西时,我意识到havingValue 需要一个常量,当然,我正在动态查找服务器的主机名。

@ConditionOnProperty(prefix="status.", value="host", havingValue=System.getProperty("hostName")  // property set elsewhere

所以我的问题是是否有人对此有解决方法?它不必使用@ConditionalOnProperty,尽管我喜欢那个解决方案。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我认为你可以使用@Conditional with a custom Condition。或者在您的 @Scheduled 方法的开头,您可以有一个 if 语句来检查主机名(例如使用 InetAddress.getLocalHost().getHostName())与您正在寻找的值。

    【讨论】:

    • Ryan,这听起来不错,但是您有在该注释中使用 bean 的示例吗?我发现的所有示例都只是使用属性。
    • 有一个stackoverflow.com/questions/44456388/…,但这似乎是一个不寻常的案例。想必静态的使用和加载的顺序有关。我应该更新答案,因为我不确定它是否像我想象的那样顺利。我想加载顺序很重要,但在您的情况下,使用与 bean 相关的表达式(如 baeldung.com/spring-expression-language 中的 2.6 中的表达式可能没问题)
    • 实际上自定义条件看起来更好 - romaniancoder.com/…
    • 同意,定制的看起来干净多了。我花了一分钟才弄清楚房产在哪里,但这很好用。感谢您的帮助。
    猜你喜欢
    • 2014-12-11
    • 2018-04-20
    • 2019-02-03
    • 2020-12-13
    • 2020-01-05
    • 1970-01-01
    • 2018-03-29
    • 2012-06-13
    • 2011-06-02
    相关资源
    最近更新 更多