2014-11-06 2 views
0
class MyActor(val service1: MyService1, val service2: MyService2) extends Actor { 
    ... 
} 

Я планирую использовать своего актера за маршрутизатором в кластере через расширение кластера akka. Некоторые родительские актеры создадут «пул» этих актеров. Таким образом, создание этого «пул» будет выглядеть примерно так:Должно ли быть состояние актера сериализовано?

context.actorOf(Props(classOf[MyActor], service1, service2), "myActor") 

и в файле конфигурации в разделе развертывания уточнит параметры маршрутизатора для этого актера.

Но я думаю, что для его работы MyService1 и MyService2 должны быть сериализуемыми, не так ли? Возможно, это требование относится не к актеру, а к его реквизитам?

ответ

1

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

Если вы хотите увидеть, если ваши актеры/реквизит/сообщения сериализуемы, вы можете пойти в конфигурации Акки и включить эти два флага (подробнее 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) 
    } 
} 

Обратите внимание, что в этом случае, если вы не сохраняющиеся своих актеров с помощью источников событий или снимка, вам необходимо повторно отправить сообщение инициализации при запуске (когда он умирает и начинает снова или когда он перемещается на другую машину). Но обычно вы используете сопротивление, и это не очень важно. Вы также можете добавить очередь сообщений в своем актере, чтобы удержать все сообщения «действия», полученные до получения сообщения об инициализации, а затем обслуживать их, как только вы получили сообщение об инициализации.

+1

Я знаю, что это немного поздно, но чтобы избежать использования опции [T], вы можете использовать поведение конечного автомата http://doc.akka.io/docs/akka/snapshot/scala/actors.html # get-unbecome передает ваши службы в состоянии, чтобы стать после получения сообщения об инициализации. – vicaba

Смежные вопросы