Я создаю проект удаленного взаимодействия 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
}
}
}
Заранее спасибо.