ここで Akka と Scala の初心者です。Scala と Akka のドメインでの私の意図を明確に表現するために、必要に応じて質問を自由に編集してください。
コード スニペットを示す前に、ここで解決したい問題があります。基本的には、チームが Akka アクターを使用してアプリケーションを開発するときに使用する共通モジュールを開発したいと考えています。主にロギングの目的で、実行時に受信機能を拡張する特性をミックスインできるようにしたいと考えています。コンパイル エラーが発生しましたが、これについては後で説明します。
しかし、まず、単純なメインを例にとります。
object Test extends App {
val system = ActorSystem("system")
val myActor = system.actorOf(Props(new MyActor), "myActor")
myActor ! "Hello world!"
}
チーム メンバーがアプリケーションに実装する可能性のあるアクターの実装例を次に示します。
class MyActor extends Actor with ActorLogger {
override def receive: Receive = {
case msg => {
log.info("testing ...")
}
case _ => throw new RuntimeException("Runtime Ex")
}
}
そして、これが mixin に共通の特性を提供する方法の例です:
trait ActorLogger extends Actor {
val log: DiagnosticLoggingAdapter = Logging(this)
abstract override def receive: Receive = {
case msg: Any => {
if (msg.isInstanceOf[String]) {
println("enter")
log.mdc(Map[String, Any]("someKey" -> 123))
super.receive(msg)
log.clearMDC()
println("exit")
}
}
case _ => throw new RuntimeException("Runtime Ex")
}
}
ご覧のとおり、メッセージがたまたま String の場合、MDC にデータを追加しようとしています (基本的な例ですが、実際には、独自のカスタム タイプを確認します)。
私が得るエラーは次のとおりです。
Error:(29, 16) overriding method receive in trait ActorLogger of type =>
MyActor.this.Receive;
method receive needs `abstract override' modifiers
override def receive: Receive = {
^
ここで何が問題なのですか?そして、スタック可能な特性は、このようなことを達成するために放棄する権利がありますか? そうでない場合、最も慣用的な方法は何ですか?
より一般的には、「インターセプター」パターン以外にここで適用されている別のパターンはありますか?
助けてくれてありがとう!