3

Scala でのアクター モデルの実装で、bang(!) 演算子をオーバーライドできますか。この演算子をオーバーロードして、メッセージ パッシングの操作を変更できますか?

シナリオ例: アクターがメッセージを渡して別のアクターを呼び出したときに、情報のログを含める必要があります。メッセージ pass(!) 演算子をオーバーロードすること
で、異なるアクター間のメッセージ パッシングを追跡し、すべてのアクター メッセージ パッシング コールに logger ステートメントを含めないようにすることはできますか?

4

3 に答える 3

2

Scala でのアクター モデルの実装で、bang(!) 演算子をオーバーライドできますか。

できますが、強くお勧めしません。

シナリオ例: アクターがメッセージを渡して別のアクターを呼び出したときに、情報のログを含める必要があります。

  1. これは、タイプを拡張しないアクター (Akka システム アクター、ライブラリによって作成されたアクターなど) では機能しません。

  2. これは Akka ですでに実行できます。設定するだけですakka.debug.receive = on

于 2012-11-14T05:35:59.067 に答える
1

!Akkaでは、意味のある方法で ActorRef のサブクラスを作成できない (つまり、それぞれのファクトリ メソッドによって生成されない) ため、オペレーターを実際にオーバーライドすることはできません。ここで私を信じてください)。

あなたが述べたユースケースは、組み込み機能によってすでにカバーされています:

import akka.event.LoggingReceive
def receive = LoggingReceive {
  case x => ...
}

これらの構成設定を有効にすると、呼び出しごとにメッセージがログに記録されます。

akka {
  loglevel = DEBUG
  actor.debug {
    receive = on     // this enables the above
    autoreceive = on // same for the likes of PoisonPill, Kill, …
    lifecycle = on   // will log actor creation, restart, termination
  }
}
于 2012-11-15T10:00:54.250 に答える
1

次のコードを試すことができます。

override def !(msg:Any):Unit =
{
   //logic for writing to logs..
   super.!(msg)
}

これはうまくいきます。ただし、送信するメッセージに応じて、! の動作を区別したいと考えています。以下に例を示します。

actor_name!(arg1,arg2,arg3)
actor_name1!(arg4, arg5)

オーバーライド コードでこれら 2 つのメッセージ送信表記を区別するにはどうすればよいですか?

于 2012-11-17T08:51:49.697 に答える