Конфигурация системы Akka в приложении, влияющем на библиотеку - PullRequest
0 голосов
/ 04 июня 2018

У меня есть опубликованная библиотека, которая использует Akka HTTP под капотом.Я не хочу, чтобы библиотека блокировала завершение приложений, поэтому Я настраиваю библиотеку ActorSystem, чтобы она была демонической документах прямо сказано, что библиотеки должны делать это в reference.conf

Если вы пишете библиотеку на основе Akka, сохраните ее конфигурацию в файле reference.conf в корнеФайл JAR.

Когда я использую эту библиотеку в приложении, которое имеет свою собственную систему 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 голосов
/ 05 июня 2018

Вам необходимо разделить конфигурацию для каждой системы, вы можете использовать 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))

С помощью этого трюка ваша система актеров приложения никогда не получит настройки актерской системы вашей библиотеки, если вы явно не сделаете этого.Тогда библиотека не повлияет на приложение.

Подробно см. руководство по akka .

...