Akka remoting - проблема с сериализацией класса с охлаждением - PullRequest
0 голосов
/ 17 мая 2019

Я создаю проект удаленного взаимодействия Akka, и у меня проблема с сериализацией.Я использую Artery remoting для Akka, отключил сериализацию Java и использую библиотеку Chill для сериализации

Предположим, есть два проекта.Первый проект отвечает за построение мастера актера.все дочерние актеры могут быть созданы в удаленном месте.Таким образом, второй проект находится в удаленном месте, чтобы запустить там дочернего актера.

Главный актер отвечает за создание дочерних актеров в удаленных местах.Каждому ребенку-актеру нужна функция для выполнения своей работы.Таким образом, главный актер помещает класс (с функцией в нем) в опору и создает ребенка с этой опорой в удаленном месте.Все эти классы расширяют черту, которая доступна во всех проектах (как первый, так и второй).Но только мастер имеет класс реализации черты (первый проект).Позвольте мне показать вам некоторый код (упрощенный для лучшего понимания):

Вот черта, которая доступна как в первом (Master), так и во втором (Child) проектах:

@SerialVersionUID(100L)
trait FuncTrait extends Serializable {
  def doTheJob(input: Tuple): Tuple
}

Реализация тольков первом (главном) проекте:

class MyFunc(key: String) extends FuncTrait{

  val rand = new Random()

  override def doTheJob(input: Tuple): Tuple = {
    val str = input.getString()
    Tuple(key + " | Appending " + rand.nextInt() + " to + " str)
  }

}

Затем главный актер создает ребенка с этой опорой:

val myfunc: FuncTrait = new MyFunc("key")
Props(new ChildActor(myfunc))

Но даже эта черта (FuncTrait) доступна в обоих проектах(удаленное местоположение), сериализация завершается с ошибкой (ошибка во втором / удаленном проекте):

[kryo] Невозможно загрузить класс com.mypackage.funcs.impl.MyFunc с ClassLoader kryo.Повторная попытка с текущим .. [WARN] [17.05.2009 23: 54: 24.688] [RemoteSystem-akka.remote.default-remote-dispatcher-8] [Десериализатор (akka: // RemoteSystem)] Не удалось десериализовать сообщение из[akka: //MasterSystem@127.0.0.1: 25520] с идентификатором сериализатора [3] и манифестом [].java.lang.RuntimeException: Не удалось сериализовать лямбда

Класс MyFunc доступен только в первом (главном) проекте.

Я думал, что только размещение классов признаков во всех проектах подойдетработа.Но, видимо, это не так.Похоже, что он ищет MyFunc (класс impl) и во втором (дочернем) проекте, и я подумал, что достаточно поместить только черту

Когда я помещаю тот же класс MyFunc (impl) в точный путь к пакету во втором проекте, он может десериализовать его без каких-либо проблем.

Я не уверен, возможно ли сделать что-то подобное.Есть ли способ заставить его работать?Или есть ли лучший способ сделать это?Или я должен также поместить класс реализации (MyFunc) во все проекты?Кстати, я проверил это и с сериализацией Java, а не с охлаждением

Вот мои свойства сериализации:

  akka {
    actor {
      provider = remote
      allow-java-serialization = off
      serializers {
        kryo = "com.twitter.chill.akka.AkkaSerializer"
      }
      serialization-bindings {
        "java.io.Serializable" = kryo
        "com.mypackage.tuple.Tuple" = kryo
      }
    }
    remote {
      artery {
        enabled = on
        transport = tcp
        canonical.hostname = "127.0.0.1"
        canonical.port = 25522
      }
    }
  }

Заранее спасибо.

...