Akkaの初心者向けの質問-AkkaEssentialsについて読んでいますが、Akka Stop / Poison PillとKillの違いを誰かに説明してもらえますか?この本は、「殺害は同期的であるのに対し、毒薬は非同期的である」というほんの少しの説明を提供しています。しかし、どのように?この間、呼び出し元のアクタースレッドはロックされますか?子役は、殺害中、停止後の呼び出し中などに通知されますか?ある概念と他の概念の使用例は?
どうもありがとう!
stop
とは両方ともPoisonPill
アクターを終了し、メッセージキューを停止します。これにより、アクターはメッセージの処理を停止し、すべての子に停止呼び出しを送信し、子が終了するのを待ってから、postStop
フックを呼び出します。それ以降のすべてのメッセージは、デッドレターメールボックスに送信されます。
違いは、このシーケンスが開始する前にメッセージが処理されることです。stop
呼び出しの場合、現在処理中のメッセージが最初に完了し、他のすべてのメッセージは破棄されます。を送信する場合PoisonPill
、これは単にキュー内の別のメッセージであるため、PoisonPill
を受信するとシーケンスが開始されます。キュー内でその前にあるすべてのメッセージが最初に処理されます。
対照的に、このメッセージにより、アクターは通常のスーパーバイザーメカニズムを使用して処理Kill
されるをスローします。ActorKilledException
したがって、ここでの動作は、スーパーバイザー戦略で定義した内容によって異なります。デフォルトでは、アクターを停止します。ただし、メールボックスは存続するため、アクターが再起動しても、失敗の原因となったメッセージを除いて、古いメッセージが残ります。
ドキュメントの「アクターの停止」、「アクターの殺害」セクションも参照してください。
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
監督戦略の詳細:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
できる限りPoisonPillを使用してください。メールボックスに入れられ、他のメッセージと同じように消費されます。アクター内から「context.stop(self)」を使用することもできます。
PoisonPillは、メールボックスに受信されたすべてのメッセージが完了した後、PoisonPillの前に、アクターを非同期的に停止します。
アクターストップとポイズンピルの両方を使用してアクターの処理を停止し、キルしてアクター全体を終了することができます。x.stopは、akka receiveメソッドで行う呼び出しであり、postStopを呼び出した後にのみ、アクターの状態を新しいアクターに置き換えます。バツ !PoisonPillは、アクターの実行中に処理を停止するためにアクターに渡すメソッドです(推奨)。postStopを呼び出した後のアクターの状態も置き換えます。x.killはアクターを終了し、アクターパス内のアクターを削除し、アクター全体を新しいアクターに置き換えます。