2016-05-07 2 views
1

私は、各ノードに "service"という名前のサービスアクターを持つ単純なクラスターを持っています。このサービスはClusterClientRecptionistで公開されており、クラスタ外のistをClusterClientで使用できるようになっています。Akka ActorSulection全体のクライアント

クライアントは、クラスタの任意のノードに作成されたユーザーを登録します(ClusterClientがランダムに送信するため)。たとえば、ノード1の場合は/user/service/user1、ノード2の場合は/user/service/user2となります。

ここでやりたいことは、登録されているすべてのユーザーに物理的な場所とは関係なくメッセージを送信することです。私はActorSelectionのように/user/service/*のように使いやすいと思っています。しかし、これは対応するノード上の局所的なacotrsを解決するだけです。

私はJavaで動作します。

答えて

1

オプション1

私はthis questionに記載されているようにDistributedPubSubMediatorを使用して、それを解決しhereを文書。

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

オプション2

二成功したオプションは、BroadcastGroupルータを使用することです。重要なことは、クラスタリングが構成で有効になっていることです。

akka.actor.deployment { 
    /allUsers { 
    router = broadcast-group 
    routees.paths = ["/user/service/*"] 
    cluster { 
     enabled = on 
     allow-local-routees = on 
    } 
    } 
} 

その後、文書化されているとおりに簡単に使用できます。

ActorRef allUsers = system.actorOf(FromConfig.getInstance().props(), "allUsers"); 
[...] 
allUsers.tell(new Text(val), self()); 
関連する問題