我在akka-scala中链接演员,每一步,新创建的演员都会向主管演员发送消息。作为回应,主管将增加一个柜台。
我不明白为什么在此操作中deadLetters
是随机生成的,有时候不是deadLetters
,有时我会得到一些。
此外,主管似乎没有增加柜台。这是我的代码
import akka.actor._
object ScopeMessages{
case object AddChild
case object Counter
}
class ScopeSet(n: Int) extends Actor{
import ScopeMessages._
var root:ActorRef = context.actorOf(Props(classOf[ScopeActor],n, self))
var counter = 0
def receive:Receive = {
case AddChild => counter += 1
case Counter => sender ! counter
case _ => ()
}
}
class ScopeActor(id: Int, apex:ActorRef) extends Actor{
import ScopeMessages._
var sub:List[ActorRef] = Nil
if (id > 0){
sub = context.actorOf(Props(classOf[ScopeActor], id-1, apex))::Nil
apex ! AddChild
}
def receive:Receive = {case _ => ()}
}
object ScopeTest extends App {
import akka.testkit.TestProbe
import ScopeMessages._
implicit val system = ActorSystem("TestSys")
val p = TestProbe()
val n:Int = 10
val base_actor = system.actorOf(Props(classOf[ScopeSet], n))
p.send(base_actor, Counter)
p.expectMsg(n)
system.shutdown()
}
感谢您的帮助。
答案 0 :(得分:3)
请记住,这里有一个异步系统。您没有在断言中看到正确计数的原因是在创建整个actor树之前正在检查计数。您可以通过在呼叫p.send
之前暂停几秒钟来验证这一点。这也可能是你获得动物的原因,因为你在有时间自行设置之前关闭了系统。 apex
actor可能已被终止,但仍在接收来自正在关闭时尝试创建的下属的AddChild
条消息。
答案 1 :(得分:3)
cmbaxter所说的一切都是真的。这里有一些解决方法的提示。尝试使用TestProbe的ActorRef构建ScopeSet,并为您接收AddChild添加条件。在testProb收到计数器之前,也不要关闭actor系统。
class ScopeSet(n: Int, testProb: ActorRef) extends Actor{
import ScopeMessages._
var root:ActorRef = context.actorOf(Props(classOf[ScopeActor],n, self))
var counter = 0
def receive:Receive = {
case AddChild => {
counter += 1
if (counter == n) { testProb ! counter }
}
case _ => ()
}
}