集群中的 Akka 成员(演员)查找

Akka member(actor) lookup in cluster

我的 actor A1 可以在集群中的任何种子节点中启动。 在某些情况下,其他参与者 A2(可能来自另一个节点)需要为 A1 获取 ActorRef。执行此操作的最佳方法是什么?
1) 我想避免硬编码种子节点网络地址。
2) 我可以 运行 订阅集群事件的参与者,但我不知道如何强制他在集群开始之前查看集群中的节点。
3) 我可以尝试通过循环 ActorSelection 来查找演员,但我仍然无法从我的 akka.Cluster 中获取种子节点列表。我找到的最接近的方法是:
Cluster cluster = Cluster.get(context().system()); SortedSet<Member>members = cluster.state().members(); Traversable<Member> filteredmembers = members.filter(_.status == MemberStatus.up()); 但这是 Scala 语法和 类,我有例外:

'_' used as an identifier (use of '_' as an identifier might not be supported in releases after Java SE 8)

如何避免这个异常?

嗯,我目前的实现是:

import akka.actor.UntypedActor;
import akka.cluster.Cluster;
import akka.cluster.Member;
import scala.collection.Iterator;
import scala.collection.immutable.SortedSet;

Cluster cluster = Cluster.get(myUntypedActor.context().system());
SortedSet<Member> members = cluster.state().members();
final Iterator<Member> iter = members.iterator();
// ..searching in every member for needed actor using iterator 

看看这个:http://doc.akka.io/docs/akka/2.4.0-RC2/java/distributed-pub-sub.html

有了这个,您可以通过角色的路径在本地或远程向集群中的角色发送消息。当你有多个集群节点 运行 同一个演员时,它甚至会为你做一个简单的路由。

尝试将单下划线替换为双下划线,应该可以。 也就是说,使用 __ 而不是 _

Cluster cluster = Cluster.get(context().system());
SortedSet<Member>members = cluster.state().members();
Traversable<Member> filteredmembers = members.filter(__.status == MemberStatus.up());