Если вы попытались немного сыграть с расширением кластера (которое основывается на вершине кластеризации), вы поймете, что при создании удаленных участников вы теряете степень, в которой вы управляете их создание. Итак, в общем, если вы хотите реквизита, вам нужно, чтобы они были сериализуемыми.
Если вы хотите увидеть, если ваши актеры/реквизит/сообщения сериализуемы, вы можете пойти в конфигурации Акки и включить эти два флага (подробнее here):
akka {
actor {
serialize-messages = on
serialize-creators = on
}
}
Я предпочел бы предложить для вас будет другой подход, который будет работать, даже если вам нужно использовать кластерное обследование (где вы не можете иметь аргументы в конструкторах): Инициализировать через сообщение.
Ваши актеры стали что-то вроде:
class MyActor extends Actor {
var service1: Option[MyService1] = None
var service2: Option[MyService2] = None
override def receive = {
case Init(s1, s2) => service1 = Some(s1); service2 = Some(s2)
}
}
Обратите внимание, что в этом случае, если вы не сохраняющиеся своих актеров с помощью источников событий или снимка, вам необходимо повторно отправить сообщение инициализации при запуске (когда он умирает и начинает снова или когда он перемещается на другую машину). Но обычно вы используете сопротивление, и это не очень важно. Вы также можете добавить очередь сообщений в своем актере, чтобы удержать все сообщения «действия», полученные до получения сообщения об инициализации, а затем обслуживать их, как только вы получили сообщение об инициализации.
Я знаю, что это немного поздно, но чтобы избежать использования опции [T], вы можете использовать поведение конечного автомата http://doc.akka.io/docs/akka/snapshot/scala/actors.html # get-unbecome передает ваши службы в состоянии, чтобы стать после получения сообщения об инициализации. – vicaba