在Scala中的Actor模型實現中,我們可以重寫bang(!)運算符。 我們可以通過重載這個操作符來修改消息傳遞的操作嗎?如何在Scala Actor模型中重載bang(!)運算符?
示例場景: 當任何角色通過傳遞消息調用其他 角色時,需要記錄信息。因此,通過重載消息傳遞(!)運算符,我是否可以跟蹤不同參與者之間傳遞的消息,並避免爲每個演員消息傳遞調用包含記錄器 語句?
在Scala中的Actor模型實現中,我們可以重寫bang(!)運算符。 我們可以通過重載這個操作符來修改消息傳遞的操作嗎?如何在Scala Actor模型中重載bang(!)運算符?
示例場景: 當任何角色通過傳遞消息調用其他 角色時,需要記錄信息。因此,通過重載消息傳遞(!)運算符,我是否可以跟蹤不同參與者之間傳遞的消息,並避免爲每個演員消息傳遞調用包含記錄器 語句?
在Scala中的Actor模型實現中,我們是否可以重寫bang(!)運算符。
你可以,但我強烈建議不要。
示例場景:當任何actor通過傳遞消息調用另一個actor時,我需要包含信息的日誌記錄。
這不會不延長你的類型的任何演員的工作:阿卡系統角色,由圖書館建立演員等
This can already be done by Akka,只需設置akka.debug.receive = on
。
在阿卡你不能真正覆蓋!
操作,因爲你不能以有意義的方式創建ActorRef的子類(即他們不會由各自的工廠方法來生成),以及這樣做的原因是,它實際上並不是你想要的(請在這裏相信我)。
您所陳述的用例已經覆蓋built-in functionality:
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)
如何區分這兩個消息發送表示法在重寫代碼?
聽起來像CISE ;-) – Jmoney38