scala - 影响应用程序的库中的 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 重新配置回默认值?
解决方案
您需要为每个系统单独配置,您可以使用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指南。
推荐阅读
- perl - 如何在 Perl 中将 arrayref 转换为 hashref?
- c++ - 如何检查用户输入是 1 还是 2
- java - 如何让 JFrame 存储数据而不刷新?
- javascript - 使用 webpacker 加载字体和图像
- google-cloud-platform - 为什么 HTTP 负载平衡器转发规则会排除封锁的 GKE 节点?
- php - Wordpress 表单操作不适用于 wordpress 中的页面链接,用于在 wordpress 中集成支付网关的永久链接平原
- javascript - 酒吧没有正确隐藏
- php - 在 MySQLi 中按相关性排序 - 如果在某行中找到关键字,则首先按此排序
- java - 将 xml doc 转换为字符串结果为空字符串
- javascript - 正则表达式 - 通过 `dot` 将字符串转换为驼峰式大写字母