【问题标题】:implicitly logging messages received by an actor in scala隐式记录 scala 中演员收到的消息
【发布时间】:2012-10-31 00:57:16
【问题描述】:

我是这种花哨的语言 scala 的新手,我正在尝试创建一个用于记录 scala 演员的库。我的库有一个类 Logger,它扩展了 Actor 类。 因此,任何使用 Actor 模型的 Scala 应用程序都可以从此类扩展,或者从 Actor 类扩展以添加日志记录功能。 例如。 MyClass 类扩展了 Logger。 在我的 Logger 类中,我实现了这样的逻辑,即每当有人向某个参与者发送消息时,它都会被发送参与者的日志文件记录下来。 为此,每当有人向另一个参与者发送消息而不是调用 scala 发送函数时,例如

caller ! msg

库的用户调用

send(caller,msg)

然后库函数将在日志中为此消息创建一个条目。这工作正常。 我希望为演员收到的消息添加类似的功能。也就是说,每当参与者收到消息时,库都应该在日志文件中为收到的消息创建一个条目。这样做的一种方法是,每当用户收到一个方法时,他都可以像这样显式调用日志方法,

while (true) {
   receive {
     case msg =>
       log(sender, msg)
       // do some stuff
   }
}

日志函数在日志中创建一个条目。 我希望用户不需要编写此行 log(sender, msg) 以便库对用户是透明的,并且没有用户需要编写的添加代码,并且所有内容都由 Logger 类隐式记录。 有没有办法做到这一点? 提前致谢。

【问题讨论】:

    标签: scala actor message-passing


    【解决方案1】:

    在 Logger 类中,重写方法 receive,使其调用 log(sender, msg),然后调用 super.receive()

    【讨论】:

    • 谢谢.. 唯一的问题是接收方法有这样的签名: override def receive[A](f: PartialFunction[Any, A]): A = { log(f) super. receive(f) } 有没有办法在 Logger 类中告诉谁发送了消息以及那是什么类型的消息? log (sender, f) 在记录器类中不起作用。 f 是部分函数,​​而不是接收到什么类型的消息。
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2013-11-29
    • 2015-06-19
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多