Я пытаюсь заблокировать возможность наличия участников в системе, которые имеют одно и то же имя (они находятся на разных путях, так что InvalidActorNameException
не будет выброшено)AKKA- как заблокировать создание актера, если его имя не является uniqe в кластере
application.conf:
someactor {
akka.remote.netty.tcp.port = 6405
akka.cluster.auto-down-unreachable-after = 20s
akka.cluster.seed-nodes = ["akka.tcp://[email protected]:2552"]
akka.actor.provider = "akka.cluster.ClusterActorRefProvider"
}
Главная:
object SomeActor extends App {
val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("someactor"))
val t = system.actorOf(Props(classOf[SomeActor]), "someActor")
}
Актер:
class SomeActor extends Actor {
val cluster = Cluster(SomeActor.system)
override def receive = {
case x=> println(x)
}
}
Если вы запускаете приложение один раз с портом 6405 и один раз с портом 6406, то приложение будет работать, но я хочу, чтобы он заметил, что система уже содержит актера с именем «someActor» и блокирует этот вызов.
Я не против добавления имени в качестве роли или другой конфигурации, если он сможет блокировать это, но я не могу иметь состояние, подобное карте, содержащей уже существующие имена (или актора, содержащего карта с передачей сообщений) или иметь длительную операцию, например actorSelection
(и в любом случае они не будут безопасными, если из нескольких мест параллельно вызывается actorOf
).
Звучит как подход, склонный к условиям гонки. Что делать, если оба игрока создаются в один и тот же момент времени на разных узлах? Итак, возможно, объясните, чего вы хотите добиться в первую очередь? (Вы после чего-то вроде ClusterSingleton? ClusterSingleton содержит аналогичную проверку, где одиночки должны жить на самом старом узле, который, как известно, согласовывается всеми узлами в кластере.) – jrudolph
Я думаю, что вы действительно ищете кластерное окошко и/или кластеров. – Ryan
Исправить меня, если я ошибаюсь, но не кластер singleton блокирует создание актеров по типу?если это не сработает для меня, потому что я хочу создать много актеров класса 'SomeActor', я просто не хочу иметь этих актеров с тем же именем (это имя - уникальный идентификатор, который у меня есть в моей программе для каждого рабочего актер, поэтому я не могу дублировать) –