2016-05-07 8 views
1

Ich habe einen einfachen Cluster mit einem Dienstakteur namens "Service" auf jedem Knoten. Dieser Service ist jeweils mit ClusterClientRecptionist exponiert, um ihn von außerhalb des Clusters mit ClusterClient nutzen zu können.Akka ActorSelection über einen ganzen Cluser

Ein Client registriert dann Benutzer, die auf zufälligen Knoten des Clusters erstellt werden (weil die ClusterClient zufällig verteilt). Zum Beispiel /user/service/user1 auf Knoten1 und /user/service/user2 auf Knoten2.

Was ich jetzt tun möchte, ist eine Nachricht an alle registrierten Benutzer zu senden, unabhängig von ihrem physischen Standort. Ich sagte, das war einfach mit einem ActorSelection wie /user/service/*. Dies löst jedoch nur lokale Acotrs auf dem entsprechenden Knoten.

Ich arbeite übrigens mit Java.

Antwort

1

Option 1

Ich löste es nur durch die DistributedPubSubMediator, wie in this question und dokumentiert here beschrieben.

private ActorRef mediator = DistributedPubSub.get(getContext().system()).mediator(); 

@Override 
public void onReceive(Object msg) throws Exception { 
    String msgStr = msg.toString(); 
    String val = msgStr.substring(4); 
    if (msgStr.startsWith("add")) { 
     ActorRef act = context().actorOf(Props.create(User.class, val), val); 
     // subscribe the newly created user on topic "allUsers" 
     mediator.tell(new DistributedPubSubMediator.Subscribe("allUsers", act), self()); 
     System.out.println("user created: " + act); 
    } else if (msgStr.startsWith("say")) { 
     // broadcast text message to all subscribed users 
     mediator.tell(new DistributedPubSubMediator.Publish("allUsers", new Text(val)), self()); 
    } 
} 

Option 2

Eine zweite Option ist erfolgreich durch einen BroadcastGroup Router. Wichtig ist, dass das Clustering in der Konfiguration aktiviert ist:

Danach kann es direkt wie dokumentiert verwendet werden.

ActorRef allUsers = system.actorOf(FromConfig.getInstance().props(), "allUsers"); 
[...] 
allUsers.tell(new Text(val), self());