2012-10-10 9 views
7

私はone_for_oneリスタート戦略を持つスーパーバイザを持っています。 子プロセスの再起動の間隔を設定することはできますか?Erlangスーパーバイザリスタート間隔

F.e.リモートDBが壊れていると私は復元の接続の試みの間に10秒待つしたいと思います。

答えて

4

実は、あなたは上司が、すぐにその子を再起動し、遅延初期化と呼ばれるものを実装してみましょうことができます:

  1. スーパーバイザ(再)(すぐに)開始した子(たとえば、gen_server)
  2. gen_serverはあなたがDBを確保するためにアクティブ待機(あなたの10秒)を行うhandle_infoではそのinit関数
  3. で0タイムアウトを返しますが正しく
を初期化されます210

このようにして、DBが適切に初期化された後、gen_serverへのすべての要求が処理されるようにします。

+0

ありがとうございますが、私はgen_server initに問題はありません。再起動の試行間に時間間隔(スリープ)が必要です。 – kolchanov

+2

@ロベルト・アロイは何がうまくいくと思いますか? gen_serverのinitは再接続を試みません。代わりに、子が起動したスーパーバイザを満たす0のタイムアウトを返します。次に、handle_info関数で、 "本物の"初期化を行います。10秒間スリープした後 – Jr0

+0

DBが生存していることを確認した後、さらにうまくいきます。一定量の時間を待つことは、すべての悪の根です。 –