Akka 和 Scala 新手在这里,请随时根据需要编辑问题,以便清楚地表达我在 Scala 和 Akka 领域的意图。
在展示代码片段之前,我要解决的问题是:我本质上想开发一个通用模块供我的团队在使用 Akka Actor 开发应用程序时使用。我想让他们混合一个特征,这将在运行时扩展他们的接收功能,主要用于日志记录。我遇到了编译错误,我很快就会解释。
但首先,以一个简单的 main 为例:
object Test extends App {
val system = ActorSystem("system")
val myActor = system.actorOf(Props(new MyActor), "myActor")
myActor ! "Hello world!"
}
这是一个团队成员可能在其应用程序中实现的参与者的示例实现:
class MyActor extends Actor with ActorLogger {
override def receive: Receive = {
case msg => {
log.info("testing ...")
}
case _ => throw new RuntimeException("Runtime Ex")
}
}
这是一个示例,说明我将如何为他们提供一个共同的特征来混合:
trait ActorLogger extends Actor {
val log: DiagnosticLoggingAdapter = Logging(this)
abstract override def receive: Receive = {
case msg: Any => {
if (msg.isInstanceOf[String]) {
println("enter")
log.mdc(Map[String, Any]("someKey" -> 123))
super.receive(msg)
log.clearMDC()
println("exit")
}
}
case _ => throw new RuntimeException("Runtime Ex")
}
}
如您所见,如果消息恰好是字符串,我正在尝试将数据添加到 MDC(一个基本示例,实际上,我会检查我们自己的一些自定义类型)。
我得到的错误是:
Error:(29, 16) overriding method receive in trait ActorLogger of type =>
MyActor.this.Receive;
method receive needs `abstract override' modifiers
override def receive: Receive = {
^
这里有什么问题?可堆叠的特征是否有权离开以实现这样的目标?如果没有,最惯用的方法是什么?
更一般地说,除了“拦截器”模式之外,这里是否应用了另一种模式?
感谢所有的帮助!