[英]How to overload bang(!) operator in Scala Actor model?
在Scala中的Actor模型實現中,我們可以覆蓋bang(!)運算符。 我們可以通過重載此運算符來修改消息傳遞的操作嗎?
示例場景:當任何actor通過傳遞消息來調用另一個actor時,我需要包含信息記錄。 所以通過重載消息傳遞(!)運算符,我可以
跟蹤在不同actor之間傳遞的消息,並避免包含每個傳遞調用的actor消息的logger語句?
在Scala中的Actor模型實現中,我們可以覆蓋bang(!)運算符。
你可以,但我強烈建議反對它。
示例場景:當任何actor通過傳遞消息來調用另一個actor時,我需要包含信息記錄。
這不適用於任何不擴展您的類型的演員:Akka系統演員,由圖書館創建的演員等。
這可以通過Akka完成 ,只需設置akka.debug.receive = on
。
在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
}
}
您可以嘗試以下代碼。
override def !(msg:Any):Unit =
{
//logic for writing to logs..
super.!(msg)
}
這很好用。 但是,我想區分!的行為,取決於我發送的消息。 例如下面:
actor_name!(arg1,arg2,arg3)
actor_name1!(arg4, arg5)
如何在重寫代碼中區分這兩個消息發送符號?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.