Я столкнулся со сценарием, в котором мне нужно проверить, существует ли конкретный субъект или нет, что можно сделать с помощью метода ActorSystem.actorSelection, указав путь к субъекту.
Однако этот метод работает правильно, когда такой субъект существует на вашем локальном узле . Если система акторов образована несколькими узлами, а актор существует на другом узле, этот метод сообщает, что актор не существует. Если я даю строку, определяющую удаленную систему-актер, этот метод работает. Но это кажется не очень хорошей идеей указывать строку удаленной системы акторов в методеactorSelection, поскольку узлы в кластере могут присоединяться и уходить.
def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = { context.system.actorSelection(s"/user/${customerId}{$deviceId}") ? Identify(deviceId) map { case ActorIdentity(`deviceId`, None) => // create new actor case ActorIdentity(`deviceId`, Some(actor)) => actor } }
приведенный выше код отлично работает, когда субъект существует на локальном узле, чтобы проверить, существует ли субъект на каком-то другом узле в кластере, мне пришлось сделать что-то вроде:
def getOrCreate(customerId: String, deviceId: String): Future[ActorRef] = { context.system.actorSelection(s"akka.tcp://Relay@node1:3503/user/${customerId}{$deviceId}") ? Identify(deviceId) map { case ActorIdentity(`deviceId`, None) => // create new actor case ActorIdentity(`deviceId`, Some(actor)) => actor } }
Есть ли лучший способ проверить, существует ли субъект во всем akka-кластере, а не только на локальном узле?