2012-11-15 5 views
2

먼저 스칼라 입문입니다 :스칼라에서 act 메소드에 추가하는 방법은 무엇입니까?

스칼라에 단순히 Actor 클래스를 확장하는 클래스가 될 로깅 기능을 작성하고 있습니다. 이 방법으로 사용자는이 클래스를 확장 할 수 있으며 로깅 기능을 사용할 수 있습니다. 기본적으로이 클래스를 확장하는 액터가 메시지를 보내거나받을 때마다 로그 파일에 기록하려고합니다. 명확하게하기 위해 모든 액터에는 나중에 대조 할 수있는 자체 로그 파일이 있습니다. 각 액터 (누가이 클래스를 확장하는지)가 메시지 보내기 - 수신시 업데이트되는 고유 한 시간 변수를 가지도록함으로써 이벤트를 주문하는 Lamport 시계 스타일 방식을 취하고 액터는 현재 시간 변수 (단순히 양의 정수)를 보낸 사람의 시간 변수를 더 큰 값으로 업데이트하십시오.

는 지금 내가 메시지를 보내는

sendMessage(recipient, message) 

처럼에게 간단한 방법을 선택했다. 이것은 액터가 X에게 메시지를 보내려는 파일에 기록 만합니다.

자, 내가 곤경에 처한 부분은 메시지를받을 때 로깅을하고 있습니다. 메시지. 배우가

myLogFile.writeLine(self.ToString+": Got a message from "+X+" at time: "+messageSendTime+", processed the message at" +Math.max(myCurrTime+1, messageSendTime+1)) 

그러나 나는이 메시지를 보낸 사람이 누구인지 알 필요가

같은 형식으로 간단히 말해서 나는이 이벤트를 기록하고자하는 메시지를 가져옵니다 때, 나는이 정보를 포함하도록 사용자에게 강제하지 않는 한 (즉, 보낸 사람의 이름, 시간 변수 등)을 사용하면 하드 (hard)가됩니다. 실제 발신자의 참조를 얻을 수있는 방법이 있습니까? 원격 액터와도 함께 사용하기를 바랍니다. 뒤에 "나는 모든 로깅을 할 수있는이 기능을 가짐으로써

def act { 
    case => // the user's case statements 
    ... 

    //somehow I append these statements to the end for the Logger class's use 
    case (LoggerClassRegisterInboundMessage, message, timeStamp) 
     InboundMessagesMap.put(timeStamp, message) 
} 

: 나는 사용자가 같은 몇 가지 추가 case 문에 그/그녀의 클래스에서 정의하는 행동 방식에 추가하면 내가 생각할 수있는 유일한 방법입니다 이 숨겨진 메시지는 사용자가 메시지를 보낼 때마다 전송됩니다. 그러나 이것은 발신자 이 로깅 기능을 사용하는 경우에만 작동합니다. 그래서 더 일반적인 질문은 : Scala에서 송신자의 클래스에 상관없이 스칼라에서 보낸 사람의 이름/toString을 얻는 방법이 있습니까?

메시지를 보내는 모든 클래스가 Logger 클래스를 확장한다는 가정하에 실제로는 괜찮습니다. 위의 예와 비슷한 행동이나 행동에 누군가를 추가하는 방법을 알고 있다면 똑같이 감사 할 것입니다!

+1

스칼라 액터는 곧 중단 될 예정입니다. 옵션이있는 경우 최대한 빨리 Akka로 전환해야합니다. 귀하의 문제를 감안할 때, Akka 액터 레퍼런스에는 액터의 전체 이름과 리모트 액터와의 작업이 포함되어 있습니다. – paradigmatic

+0

나는 Akka로 전환하는 것에 관한 담장 위에 있었다. .. 그러나 나는 바로 거기에 충분한 충분한 이유가 있다고 생각한다.한 가지 마지막으로, Akka는 이러한 종류의 기능을 지원합니까? 그는 스칼라에서 멋진 해결책을 사용합니다 : http://jiawei.li/ – awwwwwjay

+0

Akka 배우를위한 로깅 API가 있습니다 : http://doc.akka.io/docs/akka/ 2.0.4/scala/logging.html – paradigmatic

답변

1

의견에서 말했듯이, Akka는가는 길입니다. 어쨌든 2.10에서 더 이상 사용되지 않는 현재 Scala Actor API보다 훨씬 강력합니다.

그러나, 특정 문제를 공격하는, 당신이 유사한 방식으로, 로깅을 지원 배우의 특성 만들 수 있습니다 (이 실제로 작동하는지 모르겠어요,하지만 당신은 그것을 시도 할 수 있습니다) :

trait LoggingActor extends Actor { 
    override def receive[R](pf: PartialFunction[Any, R]): R = { 
     //we are appending to the partial function pf a case to handle messages with logging: 
     val loggingPf = pf orElse { 
      case (LoggerClassRegisterInboundMessage, message, timeStamp) => { 
       //do somthing with this log message. 
       message //returning the unwrapped result afterwards 
      } 
     } 
     super.receive(loggingPf) 
    } 

    //overriding the send as well 
    override def !(msg: Any): Unit { 
     //Wrap it in a logging message 
     super ! (LoggerClassRegisterInboundMessage, msg, getTimestamp()) 
    } 
} 

그리고이 같은으로 배우를 만들 것입니다 :

val myActor = new MyActor with LoggingActor 

는 희망이 도움이!

+0

akka가 설치되어 실행 중이므로 먼저이 방법을 akka에서 사용해 보겠습니다. 빠른 답장을 보내 주셔서 감사합니다! – awwwwwjay

관련 문제