我試圖阻止其在共享相同名稱的系統角色的可能性潮頭(它們是在不同的路徑,以便InvalidActorNameException
不會被拋出)AKKA-如何阻止一個演員的創造,如果它的名字是不是羣集
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」的actor並阻止該調用。
我不介意將名稱作爲角色或其他配置,如果它能夠通過阻止,但我不能有像包含現有名稱的地圖的狀態(或包含一個演員帶有消息傳遞的地圖)或者進行長時間運行的操作,如actorSelection
(並且在任何情況下,如果actorOf
是從多個地方並行調用的,它們將不安全)。
聽起來像一個容易出現競爭條件的方法。如果兩個演員都是在不同節點上的相同時間點創建的呢?那麼,也許首先解釋一下你想達到的目標? (你是否像ClusterSingleton之類的東西?ClusterSingleton包含一個類似的檢查,其中單身人士必須住在最早的節點上,這已經被羣集中的所有節點認同。) – jrudolph
我認爲你真正想要的是羣集分片和/或羣集單身人士。 – Ryan
糾正我,如果我錯了,但不是集羣單身人士阻止按他們的類型創建演員?如果是的話,它不會爲我工作,因爲我想創建許多類'SomeActor'的演員我只是不想讓這些演員具有相同的名稱(這個名字是我的程序中每個工作人員的唯一標識符演員,所以我不能有重複) –