2013-12-09 162 views
8

這可能是一個非常簡單的錯誤,但我無法使其正常工作。 我正在使用akka 2.2.3在scala中創建一個基於actor的應用程序。創建演員

簡化的設置如下:

object Main { 
    def main(args: Array[String]) = { 
    val system = ActorSystem("Test") 
    val discoverer = system.actorOf(Props[Discoverer], "discoverer") 

    implicit val timeout = Timeout(5.seconds) 

    val not = discoverer ? Messages.Find(something) 

    not.onComplete { 
     case Success(va) => println(va) 
     case Failure(err) => println(err) 
    } 
    ... 
    } 
} 

和主要演員

class Discoverer extends Actor { 
    override def preStart() = { 
    val refresher = context.actorOf(Props[Refresher], "refresher") 
    refresher ! Refresh 
    } 

    def receive = { 
    case _ => sender ! Answer 
    } 
} 

而且Refresher演員

class Refresher extends Actor { 
    ... 
} 

你應該採取什麼樣的離開這是沒有我的演員有參數化的構造函數。

但是,如果我嘗試運行我的應用程序失敗與

[ERROR] [12/09/2013 13:17:06.893] [Test-akka.actor.default-dispatcher-3] 
[akka://Test/user/discoverer] no matching constructor found on 
    class Discoverer$Refresher for arguments [] 

什麼是我的錯誤嗎?我不應該用.actorOf(Props[Class], "actorname")創建我的演員嗎?

+3

我幾乎可以肯定,問題是你正在使用內部類的進修班。不能說爲什麼。 –

+1

@ om-nom-nom這是問題所在。謝謝。不過,很高興知道這是爲什麼。 – mgttlinger

回答

11

如果您想使用嵌套類進行這項工作,您需要實例化嵌套actor,並將引用作爲構造函數arg傳入封閉actor。你看到的錯誤是說沒有no-args構造函數,所以這是一個提示。爲了讓事情工作的代碼應該是這樣的:

object InnerTest { 
    def main(args: Array[String]) { 
    val sys = ActorSystem("test") 
    sys.actorOf(Props[OuterActor]) 
    } 
} 

class OuterActor extends Actor{ 

    override def preStart = { 
    context.actorOf(Props(classOf[InnerActor], this), "my-inner-actor") 
    } 

    def receive = { 
    case _ => 
    } 

    class InnerActor extends Actor{ 
    def receive = { 
     case _ => 
    } 
    } 
} 

我的猜測是,這與試圖實例化一個非靜態內部類(通過反射)沒有給個參考,以它的外部類的事情。

https://www.assembla.com/spaces/akka/tickets/3675#/activity/ticket

+0

好的提示,雖然提出的解決方案不適合我。我在伴侶對象中定義了一個道具方法。 – Mahdi

1

Refresher是一個內部類的Discoverer,爲此,如果你想創建你需要做它的一個實例的背景下Refresher實例我通過這篇文章讀來確定這Discoverer

拿這個例子:

class A{ 
    class B{} 
} 

我可以做new A,但new B會返回一個錯誤。我必須這樣做:

val a = new A 
val b = new a.B 

這就是爲什麼阿卡未能創造這個演員。