2013-04-27 69 views
0

当处理一条消息时,是否有可能向另一个演员发送消息并等待该演员回复,然后消耗回复的消息,然后继续,如下所示,这是可行的吗?演员:可能发送和接收嵌套在一个接收

val lineMap=HashMap[String,Int]() 
receive { 
    case bigTaskMap=> 
     for (line <-readSomeFile){ 
      if(lineMap.get(line)==None){ 
       anotherActor!line // that actor will reply a hashmap which contain the key for line 
       receive { 
       case x:HashMap => lineMap=x 
       }  
      } 
      lineMap.get(line) // use that value to do further work 
     } 
} 
+0

我认为你应该查找成为/不成立或“问”。也就是说,如果是阿卡演员。在scala演员中,你只需使用“val reply = actor!?message” – Felix 2013-04-27 14:30:28

+1

这里是一个链接,其中包含关于“ask”的详细信息,它返回一个未来,它允许你阻止并等待回复:http://doc.akka。 IO /文档/阿卡/快照/斯卡拉/ actors.html – Felix 2013-04-27 14:33:23

回答

1

这个答案是阿卡(旧斯卡拉演员在斯卡拉2.10过时了)。

是的。您可以使用ask来获得未来(而不是自己创建一个完整的演员),然后在Future上调用onComplete来设置一个动作,当Future值(或错误)变为可用时,将执行该动作。不要担心Future能够多快产生一个价值 - 无所谓,因为即使Future已经可用,当调用onComplete时,onComplete动作也会执行!

但是,要非常小心:您不应该直接访问操作中包含的actor的任何状态(即变量),因为onComplete操作不会在同一个执行上下文中运行作为演员(即他们可以与原演员正在处理消息的同时运行)。相反,将更多消息发送回原始演员,或转发他们。

事实上,在某些情况下,您可能会发现最简单的事情就是发送消息,并让原始参与者处理答复。 becomeunbecome可能有帮助。但是,再次,如果使用become,请小心,在演员的新行为中,它不会丢弃应该以普通方式处理的“普通”消息。