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
从单元测试的消息。
这是怎么发生的?
如果一个Akka actor将所有消息保存在FIFO队列中,发送者如何改变? – octavian
因为在调用'status.onComplete'之后,接收函数返回并且参与者处理下一条消息。期货是异步的,它们不会阻止调用线程。 – Ryan
'status.pipeTo(sender())'为我工作..真棒..朋友..文档在这里http://doc.akka.io/docs/akka/current/scala/futures.html#use-with -actors –