我想用 akka 2.1 实现高级通信模式。然而,akka 似乎在一个关键方面与 Scala 的演员不同。scala 的 actor 允许我主动调用“receive”并提供部分函数,akka 的 actor 采用好莱坞“不要打电话给我们,我们会打电话给你”的原则,让你只静态定义一个接收函数。
在 scala 的演员中,我可以有这样的模式:
class MyActor extends Actor{
override def act(){
val x = expensiveFunc()
friend ! x
val y = receive {
case Answer(a) => println(a)
}
}
}
在这里,我明确地拨打接收电话。这样做的原因是我需要每个执行 SPMD 程序并在执行中的特定点进行通信的自治参与者。是否可以以有意义的方式使用 AKKA 来模拟这种模式?
编辑 我想全面了解我的问题是公平的。
我需要使用演员创建一个 SPMD 程序。这意味着我需要能够为演员定义行为,这不仅是反应性的,即我需要能够像在旧的 scala 演员中那样实现act() 。此外,我需要像在旧的 scala 演员中那样显式调用receive(p:PartialFunction[T,U]) 。
如果我能做到以上两件事,我将能够将我的 SPMD 程序从老演员移植到 akka 演员。然而,我怀疑由于AKKA 似乎采用的好莱坞模式( http://en.wikipedia.org/wiki/Hollywood_principle ),不可能实现行为方法。
EDIT2 我相信主动接收问题可以通过成为/不成为这样的方式来解决:
import context._
def receive(p:PartialFunction[Any,Unit]){
become(p)
receive()
unbecome()
}
但是,这要求允许嵌套调用接收。我有机会通过简单地发送如下消息来模拟act方法:
case class Act(b: ()=> Unit) extends Serializable
然后封装了我希望我的演员执行的行为。