8

Scala では、trapExit フラグを設定し、パラメーターとして 2 番目のアクターを使用して link() メソッドを呼び出すことにより、別の (リモート) アクターが終了したときにアクターに通知できます。この場合、リモート アクターが exit() を呼び出してジョブを終了すると、最初のアクターは終了メッセージを受信して​​通知されます。

しかし、リモート アクターがより適切でない方法で終了した場合 (たとえば、実行中の VM がクラッシュした場合) はどうなるでしょうか? 言い換えれば、ローカルのアクターは、リモートのアクターが利用できなくなったことをどのように発見できるのでしょうか? もちろん、(可能であれば) ローカルのアクターが Exit と同様のメッセージで通知されることを望んでいますが、実現可能ではないようです。何か不足していますか?リモート アクターの状態を継続的にポーリングする必要がありますか (この場合、どの方法が最善かはわかりません)、それともよりスマートなソリューションがありますか?

4

2 に答える 2

4

しかし、リモート アクターがより適切でない方法で終了した場合 (たとえば、実行中の VM がクラッシュした場合) はどうなるでしょうか。

アクター プロキシはメッセージを受け入れ (そしてメッセージを失い)、リモート アクターで JVM を再起動するのを待ちます。JVM のクラッシュ (およびインフラストラクチャ レベルで発生するその他の障害) を監視することは、Scala の責任をはるかに超えています。そのための適切な選択は、JMX を介した監視です。

言い換えれば、ローカルのアクターは、リモートのアクターが利用できなくなったことをどのように発見できるのでしょうか?

タイムアウト間隔を定義できます (たとえば 5000 ミリ秒)。この間にリモート アクターが応答しない場合は、リモート アクターに予期しないことが起こっていることを示しており、リモート アクターにその状態について尋ねるか、単に死んでいると見なすことができます。

リモート アクターの状態を継続的にポーリングする必要がありますか (この場合、どの方法が最適なのかわかりません)、それともよりスマートなソリューションがありますか?

アクターのグループの前に一種のポーリング ロード バランサー/ディスパッチャーを配置することができます。これは、生きていてメッセージを処理する準備ができているアクターのみを使用します (これは、背後に突然現れたり消えたりする可能性のあるリモート アクターの場合に意味があります)プロキシ) -> Scala アクターは複数のメッセージを同時に処理できますか?

于 2010-11-29T15:41:58.613 に答える
4

Actors in Scalaは言及しています (個人的にはテストされていません):

終了通知のトラップ。

場合によっては、監視アクターのメールボックスで終了通知をメッセージとして受信すると便利です。
たとえば、監視アクターは、リンクされたアクターによって処理されない例外を再スローしたい場合があります。
または、監視アクターが通常の終了に反応したい場合がありますが、これはデフォルトでは不可能です。

アクターは、フラグを使用して、メールボックス内の通常のメッセージとしてすべての終了通知を受信するように構成できますBoolean trapExit。次の例では、アクターbは自分自身をアクターにリンクしていますa

val a = actor { ... }
val b = actor {
self.trapExit = true
link(a)
...
}

アクターbが link を呼び出す前に、そのtrapExitメンバーをtrue;に設定することに注意してください。
これは、リンクされたアクターが (正常または異常に) 終了するたびに、タイプ Exit のメッセージを受け取ることを意味します
したがって、アクターbは、アクターが終了するたびに通知されます (アクターがリンクを呼び出す前にaアクターが終了していないと仮定します)。ab

では、「リモート アクターがあまり適切でない方法で終了するとどうなりますか」? 異常終了の場合でもメッセージ
を受信する必要があります。Exit

val b = actor {
  self.trapExit = true
  link(a)
  a ! 'start
  react {
    case Exit(from, reason) if from == a =>
    println("Actor 'a' terminated because of " + reason)
  }
}
于 2010-11-29T14:18:43.233 に答える