0

アプリケーションにシングルトン アクター システムがありますが、これは完全に正常に動作しますが、テストのために同じアプリケーションを同じ JVM 内でロードおよびアンロードすると、起動手順でアクターを再作成しようとするためエラーが発生します。もう存在している。

その結果akka.actor.InvalidActorNameException、アクター名が一意ではないため、 が返されます。

アクター システム自体をシャットダウンせずに、アクター システムに応じてアクターをスムーズにシャットダウンする方法を探しています。そのための合理的な戦略はどれですか?

4

2 に答える 2

1

これはあなたの質問に対する正確な答えではありません-「...アクターをスムーズにシャットダウンする方法...」ですが、同じJVMで2つのアプリケーションを起動できると述べました。

アクター システムをJVM 全体のシングルトンではなく、アプリケーション インスタンス内のシングルトンにできますか?

2 つの独立したアクター システムがあり、名前の競合がなく、特定のアクターを開始/停止する必要がありません。

一部のアクターが外界とやり取りしている場合、たとえば JMS などからのメッセージを消費している場合に問題が発生する可能性があると思います。その場合、どのアクター システムがそれらを処理しているかは明らかではありません。

于 2013-02-17T12:26:23.497 に答える
0

このようなものが欲しいですか?

object AkkaTest extends App {
  import akka.actor._
  import akka.pattern.ask
  import akka.util.Timeout
  import scala.concurrent.duration._

  val system = ActorSystem.create

  val supervisor = system.actorOf(Props[MasterOfPuppets], name = "masterOfPuppets")

  private object AllTerminated

  private class MasterOfPuppets extends Actor {

    var supervised = 0

    var waiterForTerminated: Option[ActorRef] = None

    def receive = {
      case actor: ActorRef =>
        context.watch(actor)
        supervised += 1
      case Terminated(dead) =>
        supervised -= 1
        if (supervised == 0) {
          waiterForTerminated.map(_ ! AllTerminated)
          waiterForTerminated = None
        }
      case AllTerminated =>
        if (supervised == 0) {
          sender ! AllTerminated
        } else {
          waiterForTerminated = Some(sender)
        }
    }
  }

  private class TestedActor extends Actor {
    def receive = {
      case a: Any => sender ! a
    }
  }

  implicit val timeout = Timeout(5.seconds) // needed for `?` below

  // Create first actor
  val actor1 = system.actorOf(Props[TestedActor], name = "name1")
  supervisor ! actor1
  actor1 ! PoisonPill

  val waitForIt = supervisor ? AllTerminated
  Await.result(waitForIt, 5.seconds)
  // Same name
  val actor2 = system.actorOf(Props[TestedActor], name = "name1")
  supervisor ! actor2

  println("ok then")
}

問題は非常に単純です。Akkaとメッセージは非同期です。殺した直後にアクターを作成しようとすると、名前は使用できません。新しいアクターを作成する前にThread.sleepを試してみてください。そうすれば、機能します。:)

于 2013-02-11T11:05:13.533 に答える