8

アクターに追加できる Listenable/Listener トレイトを実装しました。listenerHandlerメソッドを明示的に呼び出さなくても、このスタイルの特性をアクターにアタッチできるかどうか疑問に思っています。

また、この機能が Akka ライブラリにあることを期待していました。何か不足していますか、それとも Akka がこれを含めない理由がありますか?

trait Listenable { this: Actor =>
    private var listeners: List[Actor] = Nil

    protected def listenerHandler: PartialFunction[Any, Unit] = {
        case AddListener(who) => listeners = who :: listeners
    }

    protected def notifyListeners(event: Any) = {
        listeners.foreach(_.send(event))
    }
}

class SomeActor extends Actor with Listenable
{
    def receive = listenerHandler orElse {
        case Start => notifyListeners(Started())
        case Stop => notifyListeners(Stopped())
    }
}
4

5 に答える 5

5

直接拡張しないのはなぜですかActor、または非アクターもリッスン可能にしたい場合は、アクタをリッスン可能で拡張するリッスン可能なアクターを作成しますか?

receive次に、上で行ったように Actor でオーバーライドします (ただし、呼び出したいと思いsuper.receiveませんか? -- 渡された関数を変更したいだけです)。

于 2010-03-09T20:51:14.957 に答える
2

なぜ私はこの質問を今まで見たことがないのですか?

http://doc.akka.io/docs/akka/snapshot/scala/routing.html

于 2010-07-21T21:36:41.607 に答える
0

これが解決策です(Beginning Scalaの例の修正版):

import se.scalablesolutions.akka.actor.Actor

case class AddListener(who: Actor)
case class RemoveListener(who: Actor)

class ListenableActor extends Actor {
    private var listeners: List[Actor] = Nil

    def receive = {
        case AddListener(who) => listeners ::= who
        case RemoveListener(who) => listeners.filter(_ ne who)
    }

    protected def notifyListeners(event: Any) = {
        listeners.foreach(_.send(event))
    }
}

class ImplementingActor extends ListenableActor {
    override def receive = {
        super.receive orElse {
            case Message(content) => println(content)
        }
    }
}
于 2010-03-13T17:31:29.563 に答える
0

Akka にはこれに対するサポートが組み込まれています: https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/Listeners.scala

于 2011-09-05T13:27:58.327 に答える