有没有在scala中附加act方法的方法?

有没有在scala中附加act方法的方法?,scala,logging,actor,Scala,Logging,Actor,首先,我是Scala的新手: 我正在用Scala编写一个日志记录工具,它只是一个扩展Actor类的类。这样,用户就可以扩展这个类,日志功能就可以使用了。基本上,每次扩展此类的参与者发送或接收消息时,我都希望写入日志文件。为了澄清,每个参与者都有自己的日志文件,可以稍后进行整理。我采用Lamport clocks风格的方法对事件进行排序,方法是让每个参与者(扩展该类的参与者)都有自己的时间变量,该时间变量在消息发送接收时得到更新,参与者将比较当前时间变量(仅为正整数)和发送者的时间变量,并用两者中

首先,我是Scala的新手:

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

现在我选择了一个简单的方法,比如

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类。因此,如果有人知道如何像上面的例子那样或类似的行为,我将同样感激

正如评论中所说,阿克卡是一条出路。它比当前的Scala Actor API功能强大得多,而当前的Scala Actor API将在2.10版本中被弃用

但是,为了解决您的具体问题,您可以为支持日志记录的参与者创建一个类似的特性(我不知道这是否真的有效,但您可以尝试):

你可以用这样的东西来创造你的演员:

val myActor = new MyActor with LoggingActor

希望有帮助

Scala演员很快就会被淘汰。如果这是你的一个选择,你应该尽快切换到阿克卡。考虑到你的问题,Akka演员参考资料包含了演员的全名,并与远程演员合作。我对切换到Akka持怀疑态度……但我认为这是一个足够好的理由。最后一件事,Akka支持这种功能吗?他对Scala做了一件很酷的事情,我将在我的解决方案中使用它:有一个Akka参与者的日志API:我让Akka启动并运行,所以我将首先在Akka中尝试这种方法。谢谢你的快速回复!
val myActor = new MyActor with LoggingActor