同じ名前を共有しているアクターを別のパスに置く可能性をブロックしようとしていますので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ポートで1回、6406ポートで1回アプリケーションを実行すると、アプリケーションは動作しますが、システムに「someActor」という名前のアクタが既に含まれていることがわかります。
名前をロールとして追加したり、他の設定に追加しても構いませんが、既存の名前を含むマップのような状態を持つことはできません。メッセージの受け渡しを伴うマップ)、またはactorSelection
のような長時間実行する操作を持つことができます(いずれにしても、複数の場所から並列に呼び出された場合は安全ではありません)。
競合状態になりやすいアプローチのようです。両方のアクターが同じ時点で異なるノードに作成される場合はどうなりますか?だから、最初に達成したいことを説明してください。 (ClusterSingletonのようなものの後ろにいるのですか?ClusterSingletonには、クラスタ内のすべてのノードで合意されていることが知られている最も古いノードにシングルトンを置かなければならない同様のチェックが含まれています。) – jrudolph
あなたが本当に探しているのは、および/またはクラスタシングルトンを使用します。 – Ryan
私が間違っていても、クラスタのシングルトンではなく、そのタイプのアクターの作成をブロックしていれば訂正してください。もし私がクラス「SomeActor」クラスの多くの俳優を作りたいと思っているので、それは私のためにはうまくいかないでしょう。私は同じ名前を持つ俳優を望んでいません(この名前は、俳優、私は重複を持つことはできません) –