2013-12-09 21 views
8

これはおそらく非常に単純なエラーですが、正しく動作するようにはできません。 私はスカラーでアクターベースのアプリケーションを作成するためにakka 2.2.3を使用しています。俳優を作成

単純化された設定は以下の通りです:

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

ネストされたクラスでこれを動作させたい場合は、囲みアクターへの参照をコンストラクター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:あなたはのインスタンスのコンテキストでそれを行う必要があるRefresherのインスタンスを作成する場合

+0

良いヒントですが、提示された解決策は私のためには機能しませんでした。コンパニオンオブジェクトに小道具メソッドを定義しました。 – Mahdi

1

Refresherは、Discovererの内部クラスで、そのため私はこの記事を読んで、これを決定しましたDiscoverer

は、この例を見てみましょう:

class A{ 
    class B{} 
} 

私はnew Aを行うことができますが、new Bはエラーを返します。私はする必要があります:

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

これは、アクターがこのアクターを作成できなかった理由です。