2012-11-14 4 views
3

스칼라의 액터 모델 구현에서 bang (!) 연산자를 재정의 할 수 있습니까? 이 연산자를 오버로드하여 메시지 전달 작업을 수정할 수 있습니까?Scala에서 bang (!) 연산자를 오버로드하는 방법 Actor model?

예제 시나리오 : 액터가 메시지를 전달하여 다른 액터를 호출 할 때 정보 로깅을 포함시켜야합니다. 따라서 메시지 전달 (!) 연산자를 오버로드하면
메시지가 다른 액터간에 전달되는 것을 추적 할 수 있고 모든 액터 메시지 전달 호출에 대해 로거 문을 포함하지 않도록 할 수 있습니까?

답변

2

스칼라의 액터 모델 구현에서 bang (!) 연산자를 재정의 할 수 있습니까?

할 수도 있지만 강력히 권합니다.

예제 시나리오 : 액터가 메시지를 전달하여 다른 액터를 호출 할 때 정보 로깅을 포함해야합니다.

  1. 이 어떤 당신의 유형을 연장하지 않는 배우 작동하지 않습니다 : Akka 시스템 배우, 도서관 만든 배우 등

  2. This can already be done by Akka, 단지 akka.debug.receive = on을 설정합니다.

+0

CISE ;-)와 같이 들립니다. – Jmoney38

1
당신이 (즉, 그들은 각각의 팩토리 메소드에 의해 생성되지 않을 것이다) 의미있는 방식으로 ActorRef의 서브 클래스를 생성 할 수 있으며, 그 이유가 있다는 것입니다 때문에 당신이 실제로 ! 연산자를 재정의 할 수 없습니다 Akka에서

실제로 당신이 원하는 것이 아닙니다. (제발 여기 믿으세요).

귀하 명시된 사용의 경우 이미 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) 

어떻게하면 재정의 코드에서 두 메시지 전송 표기법을 구별 할 수 있습니까?

관련 문제