【问题标题】:Akka member(actor) lookup in cluster集群中的 Akka 成员(演员)查找
【发布时间】:2015-09-08 04:17:07
【问题描述】:

我的演员 A1 可以在集群中的任何种子节点中启动。 在某些情况下,其他actor 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)

如何避免这个异常?

【问题讨论】:

  • 如果您的问题是 _,请为 Java8 构建或将 filter() 更改为 filter(x->x.status==...)
  • 如果您只想让 A1 的单个实例存在于集群中并且集群的所有成员都可以访问它,您可能需要查看 Cluster Singletons (doc.akka.io/docs/akka/2.3.9/contrib/cluster-singleton.html)

标签: java scala akka akka-cluster


【解决方案1】:

嗯,我目前的实现是:

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 

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      尝试将单下划线替换为双下划线,这应该可以。 也就是用__代替_

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

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 2015-07-27
        • 1970-01-01
        • 2015-05-06
        • 2019-04-23
        • 1970-01-01
        • 2012-08-08
        • 2014-03-09
        • 2019-01-16
        相关资源
        最近更新 更多