自主AKKA演员主动接听

时间:2013-02-21 11:10:01

标签: scala dependency-injection akka actor

我想用akka 2.1实现高级通信模式。 然而,akka在一个关键方面似乎与Scala的演员不同。在scala的演员允许我主动调用“接收”并提供部分功能的地方,akka的演员采用好莱坞“不要打电话给我们,我们会打电话给你”原则,让你只是静态定义接收功能。

在scala的演员中,我可以有这样的模式:

class MyActor extends Actor{

  override def act(){
    val x = expensiveFunc()
    friend ! x
    val y = receive {
      case Answer(a) => println(a)
    }
  }

}

在这里,我明确地拨打电话接收。这样做的原因是我需要自主角色,每个角色执行SPMD程序并在执行中的特定点进行通信。 是否有可能以有意义的方式使用AKKA模拟这种模式?


修改 我想彻底了解我的问题是公平的。

我需要使用actor创建一个SPMD程序。这意味着我需要能够为的演员定义行为只是被动的,即我需要能够像旧的scala演员一样实现 act()。 此外,我需要明确地调用接收(p:PartialFunction [T,U]),就像我在旧的scala actor中那样。

如果我可以做上述两件事,我将能够将我的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

然后封装了我希望演员执行的行为。

2 个答案:

答案 0 :(得分:0)

Akka演员是事件驱动的。每当消息准备好从actors邮箱中消费时,将调用actor中receive中定义的partial函数并传入消息。

换句话说,“接收”不是命令式构造,您不能将其称为等待下一条消息。您想要的是通过正常的消息传递实现的。请求者actor将数据发送给worker actor,后者执行昂贵的操作,然后发回回复。

答案 1 :(得分:0)

您可以使用Stash控制您的邮箱:

http://doc.akka.io/docs/akka/2.1.0/scala/actors.html#Stash