1. 序章

Akka は、ScalaとJavaで非常に人気のあるアクターツールキットです。 アクターは、特定の計算を行うスレッドのような軽量ユニットです。 必要な数のアクターを作成できます。 計算が完了したら、これらのアクターを停止できます。

このチュートリアルでは、アクターを停止するさまざまな方法を見ていきます。

2. 設定

まず、Akkaの依存関係を持つ簡単なプロジェクトを設定しましょう。

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.6.18",
  "com.typesafe.akka" %% "akka-testkit" % "2.6.18" % Test
)

3. stop()メソッドの使用

ActorSystemstop()メソッドを使用して、アクターを停止できます。 これにより、現在のメッセージの処理が完了すると、アクターが停止します。 メールボックス内の残りのすべてのメッセージは、DeadLettersに送信されます。 やるだけやってみよう:

val system = ActorSystem("system") 
val actor = system.actorOf(Props(classOf[MessageProcessorActor])) <br />actor ! Greet("Msg 1")
actor ! Greet("Msg 2")
actor ! Greet("Msg 3") 
system.stop(actor)

メッセージMsg1 の処理中にアクターが停止した場合、アクターはメールボックスを一時停止し、現在の処理が完了するのを待ちます。 完了すると、アクターは停止し、メールボックス内の残りのメッセージはDeadLettersに送信されます。 現在のアクターが停止した後、 postStop()フックを呼び出してリソースをクリーンアップします。

停止したアクターに子アクターがいる場合は、すべての子アクターに通知されます。 現在の処理が完了するとすぐに、すべての子アクターも停止されます。 その後、親アクターは停止されます。 したがって、アクターは階層内でボトムアップ方式で停止されます。

アクターの停止は非同期プロセスであることに注意してください。つまり、アクターが完全に停止する前に stop()メソッドが返される場合があります。

子アクターの1つが長い計算を処理していて、その停止メッセージを実行できない場合、階層全体がスタックする可能性があります。

ActorContextstop()メソッドを使用して、アクターをそれ自体の内部から停止することもできます。

context.stop(self)

4. PoisonPillメッセージの使用

アクターを停止する別の方法は、PoisonPillと呼ばれる特別なタイプのメッセージをアクターに送信することです。 このメッセージは他のメッセージと同じように機能し、アクターのメールボックスにキューに入れられます。 アクターがこのメッセージを見つけると、それ自体が停止します。つまり、PoisonPillの前のすべてのメッセージが正常に処理されますPoisonPillの後に届いたメッセージはDeadLettersに送信されます。

PoisonPillをアクターに送信しましょう。

actor ! PoisonPill

5. gracefulStopを使用する

アクターを停止する別の方法は、gracefulStop()メソッドを使用することです。 このメソッドはFuture応答を返します 。 アクターが処理を完了し、構成されたタイムアウト内に終了すると、アクターは成功して戻ります。 それ以上の時間を超えると、応答は失敗しますFuture。 これは、アクターを整然と停止したい場合に特に便利です。

try {
  val stopped: Future[Boolean] = gracefulStop(actor, 5 seconds, PoisonPill) 
  Await.result(stopped, 6 seconds)
} catch { 
  // the actor wasn't stopped within 5 seconds 
  case e: akka.pattern.AskTimeoutException => 
}

6. Killを使用する

キルメッセージを使用してアクターを停止することもできます。 アクターがKillメッセージを受け取るとすぐに、現在の処理メッセージを完了し、ActorKilledExceptionをスローします。 したがって、スーパーバイザアクターは通知を受け取り、構成された監視戦略に基づいて状況を処理します。

キルメッセージは次のように送信できます。

actor ! Kill

7. 結論

この記事では、Akkaアクターを停止するさまざまな方法について説明しました。

いつものように、サンプルコードはGitHubから入手できます。