2

首先,我是 Scala 新手:

我正在 Scala 中编写一个日志记录工具,它只是一个扩展 Actor 类的类。这样用户就可以扩展这个类并且日志功能将可用。基本上,每次扩展此类的参与者发送或接收消息时,我都想写入日志文件。为澄清起见,每个参与者都有自己的日志文件,以后可以对其进行整理。我正在采用 Lamport 时钟风格的方法来对事件进行排序,方法是让每个 Actor(扩展此类)都有自己的时间变量,该变量在消息发送-接收时更新,并且 Actor 将比较当前时间变量(只是一个正整数) 与发送者的并用两者中的较大者更新其时间变量。

现在我选择让它成为一个简单的方法,比如

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))

但是我需要知道是谁发送了这条消息,除非我强迫用户在消息本身中包含这些信息(即发件人的姓名、时间变量等),否则它会变得很难(呃)。有没有办法获得实际发件人的参考?我希望它也能与远程演员一起工作。我能想到的唯一方法是,如果我在用户在他/她的类中定义的 act 方法上附加一些额外的 case 语句,例如:

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)
}

通过具有此功能,我可以在用户发送消息时发送这些隐藏消息来“在幕后”进行所有日志记录。但是,这仅在发件人使用日志记录工具时才有效。所以一个更普遍的问题是:在 Scala 中有没有一种方法可以在 Scala 中获取发件人的名称/toString,而不管发件人的类别如何?

我实际上可以假设每个发送消息的类都将扩展 Logger 类。因此,如果有人知道如何附加到类似于上述示例的行为或类似的内容,我将同样感激!

4

1 回答 1

1

正如评论中所说,Akka 是要走的路。它比当前的 Scala Actor API 强大得多,后者无论如何都会在 2.10 中被弃用。

但是,为了解决您的特定问题,您可以为支持日志记录的演员创建​​一个特征,以类似于此的方式(我不知道这是否真的有效,但您可以尝试一下):

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

希望能帮助到你 !

于 2012-11-15T13:16:42.667 回答