3

在 Scala 中的 Actor 模型实现中,我们可以覆盖 bang(!) 运算符吗?我们可以通过重载这个操作符来修改消息传递的操作吗?

示例场景:当任何参与者通过传递消息调用另一个参与者时,我需要包含信息记录。因此,通过重载消息传递(!)运算符,我可以
跟踪不同参与者之间的消息传递并避免为每个参与者消息传递调用包含记录器语句吗?

4

3 回答 3

2

在 Scala 中的 Actor 模型实现中,我们可以覆盖 bang(!) 运算符吗?

你可以,但我强烈建议不要这样做。

示例场景:当任何参与者通过传递消息调用另一个参与者时,我需要包含信息记录。

  1. 这不适用于任何不扩展您的类型的参与者:Akka 系统参与者、由库创建的参与者等。

  2. 这已经可以由 Akka 完成,只需设置akka.debug.receive = on

于 2012-11-14T05:35:59.067 回答
1

You can try the following code.

override def !(msg:Any):Unit =
{
   //logic for writing to logs..
   super.!(msg)
}

This works fine. However, i want to differentiate behavior of !, depending upon the messages I am sending. for example below:

actor_name!(arg1,arg2,arg3)
actor_name1!(arg4, arg5)

How do i differentiate between these two message sending notation in the overriding code?

于 2012-11-17T08:51:49.697 回答
1

在 Akka 中,您实际上无法覆盖!运算符,因为您无法以有意义的方式创建 ActorRef 的子类(即它们不会由相应的工厂方法生成),原因是它实际上不是您想要的(请相信我在这里)。

您声明的用例已包含在内置功能中

import akka.event.LoggingReceive
def receive = LoggingReceive {
  case x => ...
}

如果您启用这些配置设置,它将为每次调用记录一条消息:

akka {
  loglevel = DEBUG
  actor.debug {
    receive = on     // this enables the above
    autoreceive = on // same for the likes of PoisonPill, Kill, …
    lifecycle = on   // will log actor creation, restart, termination
  }
}
于 2012-11-15T10:00:54.250 回答