Scala / Akka - 通过行为堆栈传递消息?

时间:2014-01-29 18:46:47

标签: scala akka

如果我通过context become(foo, discardOld = false)堆叠了行为,是否有办法将消息推迟到行为堆栈中?

假设我已经叠加了上下文foobar。两者都对Baz消息(以及其他消息)进行了一些处理 - 如果foo位于行为堆栈的顶部,是否有办法将Baz消息传递给{ {1}}?

我认为bar警卫会阻止一个级别消费该消息,但是在传递消息之前,这仍会使case级别的副作用更加复杂 - 警卫会有是一个执行副作用的功能。

编辑其中:

我已经将堆叠的上下文用作类层次结构的(某种)替代方法。在较低级别的上下文中,所有这些actor都共享了一些基本行为,然后在区分actor之后添加了一个层中的其他行为。这是一种“替代”,因为演员可能实际上需要改变“类”以响应消息(同时保留自己,以便其他具有这些句柄的演员不需要替换一堆裁判等) 。我希望能够做的就是有条件地调用foo,同时在正确的概念层/位置保持副作用。

2 个答案:

答案 0 :(得分:1)

您可以使用Stash Trait(http://doc.akka.io/api/akka/2.0/akka/actor/Stash.html)并存储特定类型的所有消息。然后,您可以解除所有隐藏的消息并使用您的“新”(堆栈中较低的)接收行为来处理它们,因为它们不符合无意处理它们的行为。这听起来不像你想要的那样,但可能很有用。

回复您的修改:

如果你想要一个基础角色,然后让演员略微修改基础角色的接收方法,你可以使用抽象覆盖。这完全不同,堆叠接收但应该完成你正在寻找的东西:

class Base extends Actor {
   def receive {
      case Baz => println("BASIC BEHAVIOR") 
      case _ => println("other messages")
   }
}

trait BaseWithOtherWayToHandleBaz extends Base {
   def otherRecieve: Recieve = {
     case Baz => println("OVERRIDE BEHAVIOR")
   }

   abstract override def receive = otherRecieve orElse super.receieve
}

答案 1 :(得分:0)

ReceivePartialFunction,您可以使用orElseandThen撰写邮件。