影响app的库中的Akka系统配置

时间:2018-06-04 11:10:11

标签: scala akka

我有一个已发布的库,它使用了Akka HTTP。我不希望该库阻止应用终止,因此I configure the library's ActorSystem to be daemonicdocs明确表示图书馆应在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重新配置为默认值?

1 个答案:

答案 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