2013-08-19 3 views
1

Извините, если это дублирующийся вопрос.Akka: сообщение от одного актора другому

Я новичок в AKKA и пытаюсь расширить образец образца akka-java-spring, чтобы добавить другого актера и иметь неизменный объект. Счетчик используется как сообщение, которое должно быть отправлено CoutingActor, который печатает сообщение и передает его в a PrintMessageActor (новый актер). Как отправить сообщение PrintMessageActor из CoutingActor. Как использовать приведенный ниже фрагмент из документации для использования в этом случае.

target.forward(result, getContext()); 

Как получить цель (2-й актер) в первом актере?

ответ

1

Если я правильно понял ваш вопрос, вы хотите знать, откуда передающий агент знает цель, к которой он должен перейти?

Две возможности:

1) Если целевой актер уже существует, когда экспедитор актер получает воплощаться, то вы могли бы просто передать ему Таргет ActorRef с помощью конструктора или в сообщении. См. Props документацию о том, как создавать собственные экземпляры экземпляров с собственными параметрами.

2) Если цель не существует при создании экспедитора, но его путь в ActorSystem уже прояснен (например, «/ user/PrintMessageActor»), вы можете передать ActorSelection. ActorSelection может разрешить ActorRef, если в данной системе ActorSystem существует Актер на этом пути. Предпочтительным является второй вариант, поскольку ActorRef будет недействительным, если основной актер умрет. С другой стороны, ActorSelection решит возможное новое воплощение Актера на этом пути.

+0

Thank You Bjorn. Я попытаюсь использовать второй вариант. Я также хотел создать дочерних актеров для CoutingActor и PrintMessageActor. Как создаются дочерние актеры в родительском актере и как можно обрабатывать сообщения дочерними актерами? То, что я пытаюсь сделать, - передать сообщение CoutingActor - дети этого актера распечатывают сообщение, а затем сообщение передается PrintMessageActor - у которого есть дети, и они печатают сообщение. Я также хочу контролировать количество детей, которые могут иметь родительские актеры. Я был бы признателен, если бы вы могли указать мне в правильном направлении. – Sachin

+0

Hallo Sachin. Вы можете создать столько дочерних актеров, сколько захотите. Единственная разница между созданием участников первого уровня и дочерних акторов - это объект, который создает для вас творение. Если вы хотите создать актера первого уровня (например, «/ user/MyActor»), вы напрямую используете ActorSystem, скажем, system.actorOf (...) для ActorRef или system.actorSelection (...) для выбора ActorSelection , Ребенок-актер может быть создан из актера, используя ActorContext. (context.actorOf/.actorSelection) –

+0

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