2016-12-15 43 views
1

我有以下单元测试:回复发送者进入死信框

it should "return xml" in new TestScope { 
    val testProbe: TestProbe = TestProbe() 
    val someActor = system.actorOf(Props[SomeActor]) 

    testProbe.send(someActor, MakeXmlApiCall()) 
    testProbe.expectMsgPF() { 
     case Success(message) => { 
     assert(message == "someMessage") 
     } 
    } 
    } 

为了与本receive方法演员:

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 actor将所有消息保存在FIFO队列中,发送者如何改变? – octavian

+1

因为在调用'status.onComplete'之后,接收函数返回并且参与者处理下一条消息。期货是异步的,它们不会阻止调用线程。 – Ryan

+0

'status.pipeTo(sender())'为我工作..真棒..朋友..文档在这里http://doc.akka.io/docs/akka/current/scala/futures.html#use-with -actors –