簡體   English   中英

如何在Scala Actor模型中重載bang(!)運算符?

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

在Scala中的Actor模型實現中,我們可以覆蓋bang(!)運算符。 我們可以通過重載此運算符來修改消息傳遞的操作嗎?

示例場景:當任何actor通過傳遞消息來調用另一個actor時,我需要包含信息記錄。 所以通過重載消息傳遞(!)運算符,我可以
跟蹤在不同actor之間傳遞的消息,並避免包含每個傳遞調用的actor消息的logger語句?

在Scala中的Actor模型實現中,我們可以覆蓋bang(!)運算符。

你可以,但我強烈建議反對它。

示例場景:當任何actor通過傳遞消息來調用另一個actor時,我需要包含信息記錄。

  1. 這不適用於任何不擴展您的類型的演員:Akka系統演員,由圖書館創建的演員等。

  2. 這可以通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM