2013-12-11 6 views
1

Я попытался скомпилировать этот фрагмент кода, чтобы понять, как действуют актеры, но он дает мне сообщение об ошибке: value actorOf не является членом объекта akka.actor.Actorvalue actorOf не является членом объекта. Akka.actor.Actor

Я новичок в akka и не могу понять, как начать и узнать структуру реализации целого определения, такого как метод получения для каждого класса. Кроме того, какова фактическая работа ActorLogging? Может ли кто-нибудь помочь? Благодарю.

import akka.actor.Actor 

case object Start 

object Main { 
    def main(args: Array[String]): Unit = { 
    println("Start"); 
    val echo = Actor.actorOf[EchoActor] 
    echo.start() 
    echo ! "Hello World" 
    echo.stop() 
    } 
} 
class EchoActor extends Actor { 
    def receive = { 
    case s: String => println(s) 
    } 
} 
+0

Вы нашли действительно устаревший учебник ;-) Пожалуйста, взгляните на Activator (http://typesafe.com/platform/getstarted). –

ответ

0

Возможно, вам, вероятно, необходимо сначала проверить документацию Akka. Вот ссылка: http://doc.akka.io/docs/akka/snapshot/scala/actors.html

Что вы хотите сделать, это:

import akka.actor.ActorSystem 

// ActorSystem is a heavy object: create only one per application 
val system = ActorSystem("mySystem") 
val myActor = system.actorOf(Props[MyActor], "myactor2") 

(взял из документации)

Итак, прежде всего вы создаете систему Actor, и вы должны использовать систему для создания актера.

3

Похоже, вы пытаетесь использовать (я думаю) код Akka 1.x с Akka 2.x. Некоторые из семантики совершенно разные. Вот один из способов правильно реализовать:

import akka.actor._ 

object Main { 
    def main(args: Array[String]) { 
    println("Start"); 
    val system = ActorSystem("hello-world") 
    val echo = system.actorOf(Props[EchoActor]) 
    echo ! "Hello World" 
    echo ! PoisonPill 
    } 
} 

class EchoActor extends Actor with ActorLogging { 
    override def preStart() { 
    log.info("starting actor") 
    } 
    def receive = { 
    case s: String => log.info(s) 
    } 
    override def postStop() { 
    log.info("stopping actor") 
    context.system.shutdown 
    } 
} 

В принципе, вы должны использовать систему актера для создания актеров, которые больше не нужно явно запустить. Отправка сообщений работает одинаково. Чтобы остановить актера, вы отправляете ему объект PoisonPill, который заставит актера немедленно завершить работу, как только он попадет в сообщение в своем почтовом ящике.

Кроме того, я добавил к нему актера после остановки, чтобы выключить систему, когда актер остановлен, иначе приложение никогда не выйдет.

Характеристика ActorLogging позволяет легко подключить актеров к каротажной системе Akka. Когда вы смешиваете его с актером, вы получаете log, который можно использовать как обычный регистратор.

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