2013-12-09 118 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 

这就是为什么阿卡未能创造这个演员。