먼저 스칼라 입문입니다 :스칼라에서 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 클래스를 확장한다는 가정하에 실제로는 괜찮습니다. 위의 예와 비슷한 행동이나 행동에 누군가를 추가하는 방법을 알고 있다면 똑같이 감사 할 것입니다!
스칼라 액터는 곧 중단 될 예정입니다. 옵션이있는 경우 최대한 빨리 Akka로 전환해야합니다. 귀하의 문제를 감안할 때, Akka 액터 레퍼런스에는 액터의 전체 이름과 리모트 액터와의 작업이 포함되어 있습니다. – paradigmatic
나는 Akka로 전환하는 것에 관한 담장 위에 있었다. .. 그러나 나는 바로 거기에 충분한 충분한 이유가 있다고 생각한다.한 가지 마지막으로, Akka는 이러한 종류의 기능을 지원합니까? 그는 스칼라에서 멋진 해결책을 사용합니다 : http://jiawei.li/ – awwwwwjay
Akka 배우를위한 로깅 API가 있습니다 : http://doc.akka.io/docs/akka/ 2.0.4/scala/logging.html – paradigmatic