代码之家  ›  专栏  ›  技术社区  ›  Synesso

影响应用程序库的akka系统配置

  •  1
  • Synesso  · 技术社区  · 7 年前

    我有一个公开发行的库,在引擎盖下使用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,而不强制应用程序编写器将自己的actorsystem s重新配置为默认值?

    1 回复  |  直到 7 年前
        1
  •  2
  •   atline    7 年前

    您需要分离每个系统的配置,可以使用 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将永远无法获得库的actorsystem设置,除非您显式地这样做。那么lib不会影响应用程序。

    细节是指 akka guide .