我有一个已发布的库,它使用了Akka HTTP。我不希望该库阻止应用终止,因此I configure the library's ActorSystem to be daemonic。 docs明确表示图书馆应在reference.conf
如果您正在编写基于Akka的库,请将其配置保存在JAR文件根目录下的reference.conf中。
当我在具有自己的ActorSystem的应用程序中使用此库时,我希望该系统具有默认的非守护进程行为。不幸的是,库中的配置适用于在整个应用程序中创建的ActorSystems。
例如,使用我的库的主要方法将立即终止:
object Main {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("stellar-channels")
import system.dispatcher
TestNetwork.fund(KeyPair.random)
}
}
ActorSystem
的创建应确保在system.terminate()
被调用之前阻止它。但是库的配置也影响了ActorSystem("stellar-channels")
。
有没有办法可以将库的配置应用到库使用的ActorSystem,而不必强迫应用编写者将自己的ActorSystems重新配置为默认值?
答案 0 :(得分:2)
您需要为每个系统分离配置,您可以使用类型安全配置的lift-a-subtree
技巧。
E.g。
在您的图书馆中,您可以按如下方式编写application.conf
:
mylibrary {
akka.loglevel = "WARNING"
my.own.setting = 43
}
主要代码:
val config = ConfigFactory.load()
val app1 = ActorSystem("MyLib", config.getConfig("mylibrary").withFallback(config))
有了这个技巧,你的应用程序actor系统永远不会获得lib的actorsystem设置,除非你明确地这样做。然后lib不会影响应用程序。
详细信息是指akka guide。