如何解决如何覆盖包含的文件中的配置设置
我在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配置设置的最佳方法是什么?
解决方法
经过一些试验,最好的选择是将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.conf
替换规范的other-application.conf
并将您的ActorSystem
设置代码指向{{ 1}}而不是akka-application.conf
(在这种情况下可能不应该存在,因为您希望裸application.conf
调用很快就会失败(这里的替代方法是让不同的程序来争夺谁拥有的所有权) ConfigFactory.load()
。
您面临的问题实际上是设计使然。来自HOCON first page documentation:
允许重复的密钥;稍后的值将覆盖较早的值,但对象值的键将两个对象以递归方式合并
因此,当您在第二个文件中添加akka {}
时,它只是被合并而不会被覆盖。
据我所见,您有2个选择。
-
复制配置,并用实际需要的属性覆盖所有属性。这意味着,在第二个程序中,您可以添加:
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 } } }
-
另一个我不太喜欢的选项是覆盖名为akka的对象。为此,您需要为其分配不是对象的内容。否则它将被合并。例如,如果您添加第二个程序
akka=4
,则它将完全删除所有其他值。 但是!在这种情况下,您需要使用程序来处理那些缺少的属性。这意味着,在代码的某个地方,您将必须编写类似的内容(不要忘记config
会丢失):Try(config.getString("akka.actor.provider")).getOrElse(Do something here)
您必须这样做,因为现在akka是一个字符串,您无法将其作为对象来查看。
假设您要覆盖another.conf
中的akka.remote.netty.tcp.port,您只需
include "application.conf"
akka.remote.netty.tcp.port = 2562
它将覆盖netty tcp端口,而其余部分保持不变并继承
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。