首页 > 解决方案 > 影响应用程序的库中的 Akka 系统配置

问题描述

我有一个在后台使用 Akka HTTP 的已发布库。我不希望库阻止应用程序的终止,因此我将库的 ActorSystem 配置为 daemonic文档明确表示图书馆应该这样做reference.conf

如果您正在编写基于 Akka 的库,请将其配置保存在 JAR 文件根目录的 reference.conf 中。

当我在具有自己的 ActorSystem 的应用程序中使用此库时,我希望该系统具有默认的非守护程序行为。不幸的是,库中的配置适用于在整个应用程序中创建的 ActorSystems。

例如,这个使用我的库的 main 方法将立即终止:

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 重新配置回默认值?

标签: scalaakka

解决方案


您需要为每个系统单独配置,您可以使用lift-a-subtree类型安全配置的技巧。

例如

在您的库中,您可以编写application.conf如下:

mylibrary {
  akka.loglevel = "WARNING"
  my.own.setting = 43
}

主要的scala代码:

val config = ConfigFactory.load()
val app1 = ActorSystem("MyLib", config.getConfig("mylibrary").withFallback(config))

有了这个技巧,除非您明确地这样做,否则您的应用程序 actorsystem 将永远不会获得您的 lib 的 actorsystem 设置。然后lib不会影响应用程序。

详情参考akka指南


推荐阅读