Попытка написать альтернативный Hello World, используя Scala и Akka

У меня мало опыта работы с устаревшим актером Scala, недавно я начал изучать актера Akka, они кажутся совершенно разными.

Я выполнил это руководство http://doc.akka.io/docs/akka/2.2.0/scala/hello-world.html

Затем я пытаюсь написать альтернативный Hello World, используя парадигму, похожую на устаревший актер Scala. Но у меня есть некоторые трудности (см. комментарии в строке):

class Echo extends Actor {
  override def receive = {
    case a: Any => println(a)
    case "end" => context.stop(self)
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val echo = new Echo()

    // Where is explicit Actor.start() ?

    // "! is not a member", but Akka's official Hello World used ! to send message
    echo ! "Hello"
    echo ! "end"
  }
}

person Community    schedule 08.08.2013    source источник


Ответы (1)


В коде есть пара ошибок.

1) Вы не можете создать актера, просто создав экземпляр его класса. Вам нужно получить ActorRef с помощью ActorOf. Для этого вам нужно запустить ActorSystem, которая будет управлять созданием Актеров.

def main(args: Array[String]): Unit = {
  val system = ActorSystem("mySystem")
  val echo = system.actorOf(Props[Echo], "myactor2")
  echo ! "Hello"
  echo ! "end"
}

2) Ваш метод получения тоже неверен. Шаблон типа Any будет соответствовать всем, включая "end". Попробуйте что-то вроде этого:

   override def receive = {
    case "end" => context.stop(self)
    case a:String => println(a)
  }

Здесь сообщение печатается только в том случае, если оно не "end", и в этом случае оно не соответствует первому случаю и попадает ко второму.

person Harshal Pandya    schedule 08.08.2013