アクター システムと非アクター コードの相互作用に苦労しています。Akka Java ドキュメントのセクション 3.2.1では、 TypedActors を使用して、アクター システムとアクター以外の外部の世界との間のブリッジングを実行する方法について説明しています。
型指定されたアクターは、アクター システム (「内部」) と非アクター コード (「外部」) の間を橋渡しするのに適しています。
次に、3 つの異なるシナリオについて説明します。
- 一方向のメッセージ送信
- 要求応答メッセージの送信
- Request-reply-with-future メッセージ送信
しかし、これらのシナリオはすべて、非俳優の世界から開始されます。アクター システムが非アクター コードを呼び出す適切な方法は何ですか?
私がやろうとしているのは、アクター メッセージの不変のペイロードを非アクターの世界に直接公開することです。たとえば、アクター A は、アクター B から受信したメッセージの不変のペイロード (マップなど) を揮発性インスタンス変数として保持し、パフォーマンス上の理由から (通常のゲッターまたはファサード)。そのマップは不変であるため、本質的にスレッドセーフであるため、メッセージのルーティングなどのオーバーヘッドは必要ありません。アクター A は多くの非アクター スレッドからアクセスされ、たまにアクター B から更新されたマップを受け取ります。 .
public class ActorAFacade extends UntypedActor implements Map<String, String> {
private volatile Map<String, String> immutableMap = Collections.emptyMap();
@Override
public String get(Object key) {
return immutableMap.get(key);
}
@Override
public String put(String key, String value) {
throw new UnsupportedOperationException("Read Only!");
}
...
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof Map) {
immutableMap = (Map<String, String>) message;
} else {
unhandled(message);
}
}
}
各マップ メソッドのメッセージの作成とルーティングのオーバーヘッドを回避したいと考えています (型指定されていないアクターによって手動で行われるか、型指定されたアクターによって自動的に行われるかに関係なく)。
このハイブリッド アプローチは実行可能なソリューションですか (アクター システムの精神に反しますか)? Akka が提供するより良いアプローチ (イベント バス、コールバックなど) はありますか?