如何使akka actor在响应某些消息方面具有通用性?

Bla*_*man 1 scala akka

我有一个我需要制作抽象的演员,因为它被用作许多地方使用的常见模式.

abstract class SomeActor(.....) extends Actor with ActorLogging {

  def receive = {
    case Message1 =>
    case Message2 =>
    case Message3 =>
  }
}
Run Code Online (Sandbox Code Playgroud)

现在说我需要自定义一个actor实现来处理Message2的逻辑,我有什么选择才能实现这个目的?

And*_* T. 8

receive功能是一个PartialFunction[Any, Unit],所以我们可以在我们的优势使用.例如,部分函数提供了一些有用的运算符PartialFunction#orElse.

这意味着您可以在父actor中定义一个PartialFunction[Any, Unit]然后在子actor中另一个,并通过组合这些来定义receive.我们来看一些代码吧!

abstract class Parent extends Actor {
  def commonReceive: Receive = {
    case CommonHandledMessage =>
      println("common handling")
    case Message =>
      println("parent handling")
  }
}

class Child extends Actor {
  override val receive: Receive = specializedReceive orElse commonReceive

  def specializedReceive: Receive = {
    case Message =>
      println("child handling")
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,您应该小心组合这些部分函数的方式,因为您可能会对结果感到惊讶.当您使用orElse合并器时,部分函数基本上叠加在一起.所以你可以想象receive我们上面定义的方法转换成类似的东西:

override val receive: Receive = {
  case Message =>
    println("child handling")
  case CommonHandledMessage =>
    println("common handling")
  case Message =>
    println("parent handling")
}
Run Code Online (Sandbox Code Playgroud)

这意味着父处理在这里基本上没用,因为您可以从模式匹配中扣除.


我想这里的观点总是考虑如何组合这些部分函数,​​因为可能永远不会达到某些模式匹配分支.在这种情况下,永远不会达到父处理,因为它基本上是覆盖的.除此之外,部分功能真的很酷!

我希望有帮助:)