How to overload bang(!) operator in Scala Actor model?

狂风中的少年 提交于 2019-12-02 00:55:47

问题


In an Actor model implementation in Scala, can we override the bang(!) operator. Can we modify the operation of message passing by overloading this operator?

Example scenario: I need to include logging of information when any actor invokes another actor by passing a message. So by overloading the message pass(!) operator, Can I
track the message passing between different actors and avoid including logger statement for every actor message passing call?


回答1:


In an Actor model implementation in Scala, can we override the bang(!) operator.

You can, but I would strongly recommend against it.

Example scenario: I need to include logging of information when any actor invokes another actor by passing a message.

  1. This won't work with any actors which don't extend your type: Akka system actors, actors created by libraries, etc.

  2. This can already be done by Akka, just set akka.debug.receive = on.




回答2:


In Akka you cannot actually override the ! operator, since you cannot create subclasses of ActorRef in a meaningful way (i.e. they would not be generated by the respective factory methods), and the reason for this is that it is not actually what you want (please trust me here).

Your stated use-case is already covered by built-in functionality:

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

which will log a message for each invocation if you enable these configuration settings:

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
  }
}



回答3:


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?



来源:https://stackoverflow.com/questions/13371797/how-to-overload-bang-operator-in-scala-actor-model

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!