2017-04-11 1 views
0

public class étend Abonné UntypedActor {Akka: Abonné traitement des sujets multiples

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); 
} 

}

Supposons maintenant que les deux sujets ont le même nom de la structure (par exemple foo.) Mais avec différents types. Dans ce cas, comment l'abonné va connaître le message "foo" a été reçu de quel sujet?

Répondre

0

Ainsi, le DistributedPubSub (DPS) n'est qu'un moyen d'envoyer des messages à l'acteur. La boucle de réception ne se soucie pas si le message est envoyé via tell, ask, ou via un DPS, il sait juste qu'un message est dans sa boîte de réception. Qui plus est, le DPS est juste un routeur en ce sens qu'il appelle forward() sur les messages qu'il reçoit afin qu'il ne réécrive pas les informations d'expéditeur de quiconque a publié le message sur le DPS. Donc la réponse à votre question est que vous ne saurez pas ce que DPS est entré et je pense que si cela est important, il y a probablement quelque chose de mal avec la conception. Je ne peux pas penser à une raison valable pour laquelle ce serait important plutôt que l'expéditeur du message original ou le type réel du message lui-même. Donc, je ferais mon changement et vérifier les types et si j'avais besoin de savoir d'où il venait, à partir du chemin de l'ActorRef.

+0

Merci, mais je n'ai pas reçu votre réponse complètement. Est-il possible pour un abonné de s'abonner à plus d'un sujet? – PhiberOptixz

+0

Oh définitivement. Assez commun en fait. Crée simplement des moyens supplémentaires pour envoyer des messages à l'acteur. J'ai un très grand système basé sur les acteurs et certains des acteurs ont plusieurs abonnements qui s'abonnent à des messages produits par plusieurs sources. En fait, je suggérerais un sujet par acteur producteur et laisserais les consommateurs décider ce qu'ils veulent écouter. Assurez-vous simplement que si vous ne voulez pas gérer les messages, vous les consommez plutôt que de les envoyer à des lettres non pliées (donc mortes). –

+0

Merci. Je suis nouveau à ce sujet. 1) Puis-je utiliser l'ActorRef comme nom de sujet ou son mauvais design? 2) Existe-t-il un moyen de savoir si un nom de sujet particulier est déjà utilisé dans l'ensemble du cluster? 3) Supposons (la question initiale que j'ai posée) que l'abonné s'abonne à 2 Sujets et suppose que les deux sujets publient le même type d'information/message/objet, maintenant comment l'abonné sait que le message est venu de quel sujet. – PhiberOptixz