неявное протоколирование сообщений, полученных актором в scala

Я новичок в этом причудливом языке Scala, и я пытаюсь создать библиотеку для регистрации актеров Scala. В моей библиотеке есть класс Logger, который расширяет класс Actor. Таким образом, любое приложение Scala, использующее модель акторов, может расширяться от этого класса или класса Actor для добавления функциональных возможностей ведения журнала. Например. класс MyClass расширяет Logger. В моем классе Logger я реализовал логику, согласно которой всякий раз, когда кто-то отправляет сообщение какому-либо субъекту, оно регистрируется файлом журнала отправляющего субъекта. Для этого всякий раз, когда кто-то отправляет сообщение другому субъекту вместо вызова функции scala send, например

caller ! msg

пользователь библиотеки вызывает

send(caller,msg)

Затем библиотечная функция создаст запись для этого сообщения в журнале. Это прекрасно работает. Я хочу добавить аналогичные функции для сообщений, полученных актером. То есть всякий раз, когда актер получает сообщение, библиотека должна сделать запись для полученного сообщения в файле журнала. Один из способов сделать это состоит в том, что всякий раз, когда пользователь получает метод, он может явно вызвать такой метод журнала, как этот,

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

Функция журнала делает запись в журнале. Я хочу, чтобы пользователю не нужно было записывать этот строковый журнал (отправитель, сообщение), чтобы библиотека была прозрачна для пользователя, и не было добавленного кода, который пользователь должен написать, и все неявно регистрируется классом Logger. Есть ли способ добиться этого? Заранее спасибо.


person Deepti Jain    schedule 11.11.2012    source источник


Ответы (1)


в классе Logger переопределите метод receive, чтобы он вызывал log(sender, msg), а затем super.receive().

person Alexei Kaigorodov    schedule 11.11.2012
comment
Спасибо .. единственное, что у метода приема есть такая подпись: override def receive [A] (f: PartialFunction [Any, A]): A = {log (f) super.receive (f)} Есть ли как я могу сказать в классе Logger, кто отправил сообщение и что это было за сообщение? log (отправитель, f) не работает в классе регистратора. f - это частичная функция, а не тип получаемого сообщения. - person Deepti Jain; 11.11.2012