2016-12-15 10 views
1

に行く返信は、私は、次のユニットテストを持って死んでレターボックス

override def receive: Receive = { 
    case MakeXmlApiCall() => { 
     val status = Future {"someMessage"} 

     println("In SomeActor") 

     status onComplete { 
     case Success(message) => { 
      sender ! message 
     } 
     } 

    } 
    } 

「SomeActorで」に印刷され、その制御がreceiveメソッドに達することを意味します。

しかし、私はまた、このメッセージを取得しています:

[INFO] [12/15/2016 18:42:29.463] [testSystem-akka.actor.default-dispatcher-3] [akka://testSystem/deadLetters] Message [java.lang.String] from Actor[akka://testSystem/user/$a#-1159394947] to Actor[akka://testSystem/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 

はなぜユニットテストからdead-letterではなく、testProbeに送信されたメッセージです。

どうしてですか?

答えて

6

sender()が変更されている可能性があるため、コールバックまたはオペレータからの将来のsender()(または任意のアクター状態)の参照は安全ではありません。 status.pipeTo(sender())

また、あなたのexpectMsgPF()呼び出しは、あなたが実際にSomeActorから送信しているものに一致していません:

代わりパイプ送信者に将来を使用する必要があります。 Successのインスタンスではなく、文字列で返信しています。

+0

AkkaアクタがすべてのメッセージをFIFOキューに保持する場合、送信者はどのように変更できますか? – octavian

+1

'status.onComplete'を呼び出した後、receive関数が戻り、アクターが次のメッセージを処理するためです。先物は非同期で、呼び出しスレッドをブロックしません。 – Ryan

+0

'status.pipeTo(sender())'は私のために働いた..恐ろしく..友人..ドキュメンテーションはhttp://doc.akka.io/docs/akka/current/scala/futures.html#use-withにここに行く - アクター –

関連する問題