2013-08-03 4 views
4

Ниже класса вызывает ошибку на линии новой HelloWorld:Как начать Scala AKKA актера

Exception in thread "main" akka.actor.ActorInitializationException: You cannot create an instance of [HelloWorld] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation. 
    at akka.actor.ActorInitializationException$.apply(Actor.scala:219) 
    at akka.actor.Actor$class.$init$(Actor.scala:436) 
    at HelloWorld.<init>(HelloWorld.scala:4) 
    at Driver$.main(HelloWorld.scala:38) 
    at Driver.main(HelloWorld.scala) 

Так я стараюсь: val hw = actorOf(new HelloWorld) Но это приводит к ошибке компилятора:

not found: value actorOf 

Как следует Ниже приведен пример HelloWorld?

Чтение других документов Scala требует, чтобы метод действия был определен внутри класса, который расширяет действие, а затем вызывает метод start в этом классе, есть ли причина использовать actorOf вместо определения метода act?

Ниже класса берется из Scala AKKA документы http://doc.akka.io/docs/akka/2.2.0/scala.html:

import akka.actor.Actor 
import akka.actor.Actor._ 
import akka.actor.Props 

class HelloWorld extends Actor { 

    override def preStart(): Unit = { 
    // create the greeter actor 
    val greeter = context.actorOf(Props[Greeter], "greeter") 
    // tell it to perform the greeting 
    greeter ! Greeter.Greet 
    } 
    def receive = { 
    // when the greeter is done, stop this actor and with it the application 
    case Greeter.Done => context.stop(self) 
    } 

    object Greeter { 

    case object Greet 
    case object Done 


    } 
    class Greeter extends Actor { 
    def receive = { 
     case Greeter.Greet => 
     println("Hello World!") 
     sender ! Greeter.Done 
    } 
    } 


} 

object Driver { 

    def main(args: Array[String]) { 
     new HelloWorld 
    } 

} 
+2

act() и start() принадлежат старым и устаревшим актерам Scala, Akka - это другая актерская реализация, пожалуйста, обратитесь к документам по адресу http://akka.io. –

+0

@RolandKuhn благодарит за ссылку, после некоторого копания этот документ доказывает свою полезность: http://doc.akka.io/docs/akka/snapshot/scala/actors.html#actors-scala –

ответ

8

Вам необходимо отредактировать свой основной, как показано ниже. Во-вторых, в строке 5 вам нужно изменить его на context.actorOf(Props(new Greeter)). Это связано с тем, что у вашего Greeter нет функции apply, поэтому вам нужно вручную создать объект Greeter.

Рабочий код ниже:

import akka.actor.ActorSystem 

class HelloWorld extends Actor { 

    override def preStart(): Unit = { 
    // create the greeter actor 
    val greeter = context.actorOf(Props(new Greeter), "greeter")//line 5 
    // tell it to perform the greeting 
    greeter ! Greeter.Greet 
    } 
    def receive = { 
    // when the greeter is done, stop this actor and with it the application 
    case Greeter.Done => context.stop(self) 
    } 

    object Greeter { 

    case object Greet 
    case object Done 


    } 
    class Greeter extends Actor { 
    def receive = { 
     case Greeter.Greet => 
     println("Hello World!") 
     sender ! Greeter.Done 
    } 
    } 


} 

object Driver { 

    def main(args: Array[String]) { 
     val system = ActorSystem("Main") 
     val ac = system.actorOf(Props[HelloWorld]) 
    } 

} 
4

Если вы хотите использовать свой главный класс сделать следующее:

import akka.actor.{ActorSystem, Props} 
object Driver extends App {  
    val system = ActorSystem("System") 
    val hw = system.actorOf(Props[HelloWorld], name = "hw") 
} 

который создаст новую систему актера, а затем создать актера HelloWorld, использующего эту актерскую систему.

Вы также можете руководствоваться инструкциями akka: set Akka.Можно как основной класс и дать программе «com.example.HelloWorld» в качестве аргумента.

2
val greeter = context.actorOf(Props(new Greeter), "greeter")//line 5 

Я не думаю, что вам нужно иметь новое ключевое слово там Greeter. Я полагаю, что Подставки делают это для вас уже. Если что-либо, имеющее новый, должно быть

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