我遇到了一个场景,我需要检查特定演员是否存在,这可以通过 ActorSystem.actorSelection 方法通过指定演员路径来完成。
但是,当您的本地节点上存在此类参与者时,此方法可以正常工作。如果actor-system由多个节点组成,并且actor存在于另一个节点上,则该方法告诉actor不存在。如果我给出指定远程演员系统的字符串,那么此方法有效。但是,在 actorSelection 方法中指定远程 actor-system 字符串似乎不是一个好主意,因为集群中的节点可以加入和离开。
def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = { context.system.actorSelection(s"/user/${customerId}{$deviceId}") ?识别(deviceId)映射{ case ActorIdentity(`deviceId`, None) => // 创建新的演员 case ActorIdentity(`deviceId`, Some(actor)) => 演员 } }
当演员存在于本地节点上时,上面的代码工作正常,为了检查演员是否存在于集群中的另一个节点上,我必须执行以下操作:
def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = { context.system.actorSelection(s"akka.tcp://Relay@node1:3503/user/${customerId}{$deviceId}") ?识别(deviceId)映射{ case ActorIdentity(`deviceId`, None) => // 创建新的演员 case ActorIdentity(`deviceId`, Some(actor)) => 演员 } }
有没有更好的方法来检查整个akka-cluster中是否存在actor而不仅仅是本地节点?