除了这里的其他答案之外,另一种方法是使用orElse
将部分函数添加到您的receive
. 在该部分函数中,将登录信息放入其中,isDefinedAt
以便在每条消息上调用它。
例如:
trait ReceiveLogger {
this: Actor with ActorLogging =>
def logMessage: Receive = new Receive {
def isDefinedAt(x: Any) = {
log.debug(s"Got a $x")
false
}
def apply(x: Any) = throw new UnsupportedOperationException
}
}
class MyActor extends Actor with ActorLogging with ReceiveLogger {
def receive: Receive = logMessage orElse {
case ...
}
}
使用orElse
是构成receive
行为的一般方法。在大多数情况下,我正在编写如下内容:
def otherBehavior: Receive = {
case OtherMessage => ...
}
class MyActor extends Actor {
def receive = otherBehavior orElse {
case ...
}
}
在此演示文稿中可以看到可堆叠特征方法的一个很好的示例:http ://www.slideshare.net/EvanChan2/akka-inproductionpnw-scala2013