Akka ActorSelection一整个cluser

时间:2016-05-07 09:20:11

标签: java akka akka-cluster

我有一个简单的集群,其服务人员名为" service"在每个节点上。此服务分别以ClusterClientRecptionist公开,以便能够使用ClusterClient群集外部的ist。

然后,客户端注册在群集的随机节点上创建的用户(因为ClusterClient随机调度)。例如,node1上的/user/service/user1和node2上的/user/service/user2

我现在要做的是向所有注册用户发送消息,而不管他们的实际位置如何。我很容易使用像ActorSelection这样的/user/service/*。但这只能解析相应节点上的本地acotrs。

我顺便使用Java。

1 个答案:

答案 0 :(得分: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());