2015-01-04 2 views
11

Я разрабатываю приложение, использующее Akka, и вещь, которая меня беспокоит, все время рассматривает объявление сообщения с помощью Actor. Где я должен объявлять сообщения? В сопутствующем объекте приемников или сопутствующем объекте отправителей или на каком-то третьем месте?Где должно быть объявлено действие актера?

ответ

6

Акка команда рекомендует Сообщение должно быть определено в том же месте, метод props должен быть: in the Receiver's Companion object, поскольку приемник реализует частичную функцию receive и должен знать обо всех сообщениях, которые он поддерживает. Кроме того, несколько отправителей могут отправлять набор сообщений (реализуемых приемником), поэтому вы не можете поместить его в один отправитель.

+0

Не могли бы вы продолжить дальше * «Команда Akka рекомендует» *? Будет уместна веб-страница. –

+3

Мы рекомендуем это :-) Добавлена ​​ссылка на документы для ответа Soumya => http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practices –

+0

Спасибо Konrad! –

3

Если the official Typesafe Activator template activator-akka-scala-seed имеет какое-то значение в отношении надлежащей практики AKKA в сообщения должны быть частью объекта-компаньона, как показано в следующем PingActor актера (скопированной непосредственно из шаблона):

package com.example 

import akka.actor.{Actor, ActorLogging, Props} 

class PingActor extends Actor with ActorLogging { 
    import PingActor._ 

    var counter = 0 
    val pongActor = context.actorOf(PongActor.props, "pongActor") 

    def receive = { 
    case Initialize => 
     log.info("In PingActor - starting ping-pong") 
     pongActor ! PingMessage("ping") 
    case PongActor.PongMessage(text) => 
     log.info("In PingActor - received message: {}", text) 
     counter += 1 
     if (counter == 3) context.system.shutdown() 
     else sender() ! PingMessage("ping") 
    } 
} 

object PingActor { 
    val props = Props[PingActor] 
    case object Initialize 
    case class PingMessage(text: String) 
} 

Примечание PingActor, который содержит все (как вы могли заметить, это не соблюдается строго, так как PongActor.PongMessage также принимается, но не определено в сопутствующем объекте PingActor).

С другой вопрос How to restrict actor messages to specific types?Viktor said:

Общая практика, чтобы объявить, что сообщения актер может получить в компаньон объекта Актера, что делает его гораздо легче знать, что он может получить.

+1

Фактически этот пример показывает, что типы сообщений могут быть (повторно) использованы для разных участников. Может быть, это хорошая практика поместить сообщения _command_ в сопутствующий объект принимающего актора и сообщения _event_ в другом месте? Здесь 'PingMessage' должен ** не ** находиться в компаньон-объекте' PingActor', потому что этот актер не получает это сообщение. Правильное место - это сопутствующий объект «PongActor». 'PongMessage' должен находиться в приемном объекте-компаньоне PingActor. Но это событие-иш и может быть определено в нейтральном объекте и испускается другими актерами. – Sebastian

+0

@ Себастиан звучит слишком сложно для моего вкуса. Если кто-то спросит вас «где», вы не сможете сразу ответить - давайте использовать простые правила здесь «в компаньоне» легко запомнить и имеет смысл, так как это «парень, который их понимает», подумайте об этом как это «это ребята * протокол *». –

+0

@ Konrad'ktoso'Malawski Мне нравится 3 вещи в вашем комментарии: 1. соглашения, 2. протоколы и 3. обработка объектов/актеров, таких как живые существа _talking_ друг с другом. Но начальный вопрос заключался в следующем: «Где я должен объявлять сообщения? В сопутствующем объекте приемников или сопутствующем объекте отправителей?_ Извините, если я слишком строг, но в приведенном выше примере не очевидно, в каком сопутствующем объекте должны быть объявлены «PingMessage» и «PongMessage». Получающий «PongActor» должен по договоренности понимать «PingMessage» в своем _protocol_, не так ли? ;-) – Sebastian

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