2017-04-11 9 views
0

パブリッククラス加入者がUntypedActor {アッカ:Subscriberは

public Subscriber() { 
    ActorRef mediator = 
      DistributedPubSub.get(getContext().system()).mediator(); 
    // subscribe to the topic named "content" 
    mediator.tell(new DistributedPubSubMediator.Subscribe("content", getSelf()), 
      getSelf()); 
    mediator.tell(new DistributedPubSubMediator.Subscribe("content_2", getSelf()), 
      getSelf()); 
} 

public void onReceive(Object msg) { 
    if (msg instanceof String) 
     System.out.println("Message received: " + msg); 
    else if (msg instanceof DistributedPubSubMediator.SubscribeAck) 
     System.out.println("subscribing"); 
    else 
     unhandled(msg); 
} 

}

を拡張する複数のトピックを扱う今トピックが同じ構造体名(例えばFOO)を有するが、異なるタイプの両方と仮定する。この場合、サブスクライバはどのトピックから "foo"メッセージを受信したかを知ることができますか?

答えて

0

したがって、DistributedPubSub(DPS)は、アクターにメッセージを取得する手段に過ぎません。 receiveループは、メッセージがtell、ask、またはDPS経由で送信されても​​、メッセージがその受信トレイにあることを知っているだけで気にしません。 DPSは受信したメッセージに対してforward()を呼び出すので、DPSにメッセージを公開した人の送信者情報は書き換えられません。あなたの質問に対する答えは、それがどんなDPSに入ってきたのか分からないことです。それが問題であれば、おそらくデザインに何か問題があると思います。元のメッセージの送信者やメッセージ自体の実際のタイプではなく、それが重要である妥当な理由を考えることはできません。だから私は私の切り替えとタイプをチェックし、もしActorRefのパスから来た場所を知る必要があれば、それを行います。

+0

ありがとうございますが、私はあなたの答えを完全に得られませんでした。購読者が1つ以上のトピックに登録することは可能ですか? – PhiberOptixz

+0

ああ間違いなく。実際にはよくあることです。アクターにメッセージを受け取るための追加手段を作成するだけです。私は非常に大規模な俳優ベースのシステムを持っており、いくつかの俳優はいくつかの情報源によって作成されたメッセージを購読するいくつかの購読を持っています。私は、実際には、俳優の制作者ごとにトピックを提案し、消費者が聞きたいことを決めることができます。あなたがメッセージを処理したくない場合は、メッセージをundandledに送るのではなく、メッセージを消費するようにしてください。 –

+0

ありがとうございます。私はこのトピックのものに新しいです。 1)ActorRefをトピック名またはその悪いデザインとして使用できますか? 2)特定のトピック名が既にクラスタ全体で使用されているかどうかを知る方法はありますか?3)質問者が2つのトピックを購読していると仮定して、両方のトピックが同じタイプを公開していると仮定します情報/メッセージ/オブジェクトのうち、メッセージがどのトピックから来たのかを加入者がどのように知るか。 – PhiberOptixz