Как создать Actor с несериализуемыми зависимостями на удаленном узле? - PullRequest
0 голосов
/ 29 августа 2018

Предположим, у вас есть Актер MyActor, который зависит от объекта, который нельзя сериализовать. Примеры включают в себя:

  • Джексон ObjectMapper, для манипулирования Json
  • какая-то услуга, полученная из DI-контейнера

Props для такого актера может выглядеть так в Java:

public static Props props(ObjectMapper m, SomeService s) {
    return Props.create(new Creator<MyActor>() {
        @Override
        public MyActor create() throws Exception {
            return new MyActor(m, s);
        }
    });
}

Зависимости передаются в конструктор Actor. Проблема заключается в том, что это не будет работать в кластерной среде: эти объекты не сериализуемы, поэтому попытка создать актора на удаленном узле не удастся.

Как мы можем решить эту проблему без с использованием статического глобального состояния?

1 Ответ

0 голосов
/ 03 сентября 2018

Могут быть разные типы решений, это зависит от ваших потребностей.

Вы можете обернуть сервис, например, в Cluster Singleton, а затем отправить ему ссылку актера по всему кластеру, тогда ваш реквизит актера будет иметь такую ​​подпись: public static Props props(ActorRef refToMapperWrapper, ActorRef refToServiceWrapper).

Другое решение заключается в создании новой службы и сопоставителя объектов на нужном вам узле. Затем вы должны отправить объекты, необходимые для создания Service / ObjectMapper (т.е. аргументы конструктора) между узлами, поэтому эти объекты должны быть как-то сериализованы.

ObjectMapper лучше создавать на каждом из узлов независимо, однако его конфигурация может быть отправлена ​​через узлы.

...