0

アクター システムと非アクター コードの相互作用に苦労しています。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 が提供するより良いアプローチ (イベント バス、コールバックなど) はありますか?

4

2 に答える 2

0

俳優以外の世界であなたが何を求めているのか正確にはわかりませんが、尋ねるという意味ですか?

ActorSystem system = ActorSystem.create("system");
ActorRef actor = system.actorOf(Props.create(SomeActor.class), "someActor");

Timeout t = new Timeout(5, TimeUnit.SECONDS);
Future<Object> future = Patterns.ask(actor, "some message", 1000);
try {String response = (String) Await.result(future, t.duration());} catch(Exception e){}

したがって、基本的には「何らかのメッセージ」であるメッセージを SomeActor アクターに送信し、次にその onReceive メソッドで必要な

    public void onReceive(Object msg) throws Exception
    {
            if (msg instancof String)
            {
                getSender().tell("here is the response");
            }
    }

したがって、 System.out.println(response) を実行すると、「ここに応答があります」と出力されますが、コメントに示されているようにエージェントを使用することもできますが、彼らは私を驚かせます ( ;

于 2015-07-02T03:08:47.567 に答える