【问题标题】:How do I overwrite config settings from an included file如何覆盖包含文件中的配置设置
【发布时间】:2020-08-26 19:03:23
【问题描述】:

我在 application.conf 中定义了一些 akka 远程设置:

akka {
    actor {
        provider = "akka.remote.RemoteActorRefProvider"
        warn-about-java-serializer-usage = false
    }
    remote {
        enabled-transports = ["akka.remote.netty.tcp"]
        netty.tcp {
            hostname = "myhost"
            port = 2561
            maximum-frame-size = 256000b
        }
    }
}

但是我有另一个程序需要从我的 application.conf 访问其他配置设置。但我需要忽略 akka 配置设置。所以我为第二个程序尝试了以下内容:

include "application"

akka {}

但是 application.conf 中的 akka 设置仍在应用中。我知道这一点是因为我在 akka 端口上遇到了绑定异常,尽管我的第二个应用程序中应该没有远程 akka

对我来说,清除/忽略 application.conf 中的 akka 配置设置的最佳方法是什么?

【问题讨论】:

  • 这些答案对您有帮助吗?

标签: scala akka typesafe-config


【解决方案1】:

经过一些实验后,最好的办法是 IMO 将您的 application.conf 分解出来,以便您的常用设置在它们自己的 conf 文件中。

因此,您可以将常用设置放在 common-settings.conf 中,然后在您的 Akka 应用程序中

include "common-settings"

akka {
  // Akka settings here
}

而其他需要common-settings 的模块可以在他们的application.conf 中:

include "common-settings"

这对于多模块构建可能会更好。如果它们相同,例如 sbt 模块,那么您可能会将规范的 application.conf 替换为 akka-application.confother-application.conf 并将您的 ActorSystem 设置代码指向 akka-application.conf 而不是 application.conf(其中在这种情况下可能不应该存在,因为您希望裸 ConfigFactory.load() 调用很快失败(这里的替代方法是让不同的程序争夺谁拥有 application.conf)。

【讨论】:

    【解决方案2】:

    您面临的问题实际上是设计使然。来自HOCON first page documentation

    允许重复键;后面的值会覆盖前面的值,除了两个对象递归合并的对象值键

    因此,当您在第二个文件中添加 akka {} 时,它只是被合并,而不是被覆盖。

    如我所见,您有两个选择。

    1. 复制配置,并用您实际需要的属性覆盖所有属性。这意味着,在第二个程序中,您可以添加:

      akka {
          actor {
              provider = "new value"
              warn-about-java-serializer-usage = false
          }
          remote {
              enabled-transports = ["completely new values"]
              netty.tcp {
                  hostname = "etc..."
                  port = 2561
                  maximum-frame-size = 256000b
              }
          }
      }
      
    2. 另一个我不太喜欢的选项是覆盖名为 akka 的对象。为此,您需要为其分配一些不是对象的东西。否则它只会被合并。例如,如果您添加第二个程序akka=4,那么它将完全删除所有其他值。 但是!在这种情况下,你有你的程序来处理那些丢失的属性。这意味着,您必须在代码中的某个地方编写类似的内容(不要忘记 config 会在丢失时抛出):

      Try(config.getString("akka.actor.provider")).getOrElse(Do something here)
      

      您必须这样做,因为现在 akka 是一个字符串,您不能将其视为一个对象。

    【讨论】:

      【解决方案3】:

      假设您想覆盖 another.conf 中的 akka.remote.netty.tcp.port,您只需

      include "application.conf"
      
      akka.remote.netty.tcp.port = 2562
      

      它将覆盖 netty tcp 端口,而其余部分保持不变并继承

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2018-11-29
        • 1970-01-01
        • 2023-02-06
        • 2018-11-10
        • 2014-12-18
        • 1970-01-01
        相关资源
        最近更新 更多