我的情况是我的演员A1可以在集群中的任何种子节点中启动。
在某些情况下,其他actor A2(可能来自另一个节点)需要为A1获取ActorRef。执行此操作的最佳方法是什么?
1)我想避免硬编码种子节点的网络地址
2)我可以运行订阅群集事件的actor,但我不知道如何强迫他在启动之前看到群集中的节点。
3)我可以尝试通过循环ActorSelection来查找actor,但我仍然无法从我的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)
如何避免此异常?
答案 0 :(得分:1)
尝试将单个下划线替换为双下划线,这应该可行。 也就是说,使用__而不是_
Cluster cluster = Cluster.get(context().system());
SortedSet<Member>members = cluster.state().members();
Traversable<Member> filteredmembers = members.filter(__.status == MemberStatus.up());
答案 1 :(得分:0)
好吧,我目前的实施是:
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