ActorSystem.Create () игнорирует конфигурацию - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь создать экземпляр системы актера с нестандартным поведением (например, кластеризация или удаленное взаимодействие), но независимо от того, что я делаю, ActorSystem всегда заканчивается настройкой по умолчанию. Объект конфигурации и объект настроек выглядят корректно (например, actor.provider == cluster), но фактический объект времени выполнения всегда имеет значения по умолчанию.

Я пытался создать конфигурацию многими различными способами. С помощью App.config cdata, вручную анализируя файл конфигурации с ConfigurationFactory и передавая его в Create. У меня была проблема с 1.4.3 и с 1.3.17.

Я скачал исходный код Akka и отладил его. Пройдя по методу Create, я обнаружил, что словарь предметов root HoconObject содержит 2 записи с ключом "akka". Одна запись моя, другая выглядит как запасной вариант. Метод getter разрешает запасной вариант.

Я предполагаю, что происходит странное форматирование строки ...

Debugging the Hocon getter with 2 keys

[Обновить] Там кажется, путаница о том, что на самом деле происходит. Вот снимок экрана того, как HoconObject выглядит, когда он работает:

Debugging the Hocon getter with 1 (overridden) key

На снимке экрана вы можете ясно видеть сингл запись в словаре элементов для "akka", для которой задано значение "provider = cluster", которое не является значением по умолчанию и поступает из файла конфигурации. На предыдущем снимке экрана показаны 2 записи, одна из которых «provider = cluster», а другая явно используется по умолчанию, которую вводит Akka. Оба ключа = "Акка". Ошибка заставляет Akka выбрать значение по умолчанию, а не переопределение.

Я понимаю, что Hocon допускает переопределения по умолчанию, но это не то, что происходит. Опять же, если вы посмотрите на исходный код HoconObject, то увидите, что снимок экрана представляет собой простой словарь. Net, называемый «Items», и TryGetValue является реализацией. Net ... а не реализацией Hocon.

Это явно ошибка синтаксического анализа, в результате которой Akka ведет себя некорректно и не выдает никаких исключений.

1 Ответ

1 голос
/ 30 марта 2020

У меня недостаточно репутации, чтобы оставить свой вопрос в качестве комментария.

У вас есть код, который я могу использовать для репликации проблемы? Фрагмент кода того, как вы строите свою конфигурацию, будет в порядке.

Я скачал исходный код Akka и отладил его. Пройдя по методу Create, я обнаружил, что словарь предметов root HoconObject содержит 2 записи с ключом «akka». Одна запись моя, другая выглядит как запасной вариант. Метод getter разрешает запасной вариант.

Да, это фактическое поведение HoconValue. HoconValue - это список фрагментов значений, которые будут преобразованы в правильный тип данных при вызове соответствующей функции получения. Например, экземпляр HoconValue, который вы видите в сеансе отладки, на самом деле представляет собой 2 фрагмента HoconObject, и нужный объединенный объект можно получить, вызвав функцию GetObject() этого экземпляра HoconValue.

...