2012-11-14 52 views
3

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

示例場景: 當任何角色通過傳遞消息調用其他 角色時,需要記錄信息。因此,通過重載消息傳遞(!)運算符,我是否可以跟蹤不同參與者之間傳遞的消息,並避免爲每個演員消息傳遞調用包含記錄器 語句?

回答

2

在Scala中的Actor模型實現中,我們是否可以重寫bang(!)運算符。

你可以,但我強烈建議不要。

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

  1. 這不會不延長你的類型的任何演員的工作:阿卡系統角色,由圖書館建立演員等

  2. This can already be done by Akka,只需設置akka.debug.receive = on

+0

聽起來像CISE ;-) – Jmoney38

1

在阿卡你不能真正覆蓋!操作,因爲你不能以有意義的方式創建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 
    } 
} 
1

你可以試試下面的代碼。

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

這工作正常。但是,我想根據我發送的消息來區分!的行爲。例如下面:

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

如何區分這兩個消息發送表示法在重寫代碼?