簡體   English   中英

創建一個演員

[英]Create an actor

這可能是一個非常簡單的錯誤,但我無法讓它正常工作。 我正在使用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")創建我的演員嗎?

如果你想使用嵌套類來實現這個功能,你需要實例化嵌套的actor,它將對封閉actor的引用作為構造函數arg傳遞。 你看到的錯誤是說沒有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

RefresherDiscoverer的內部類,因此,如果要創建Refresher的實例,則需要在Discoverer實例的上下文中執行此操作。

舉個例子:

class A{
  class B{}
}

我可以做new A ,但new B將返回錯誤。 我要做:

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

這就是為什么akka未能創造出這個演員的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM