2

したがって、いくつかの gen_servers がクラスター内の別の場所で稼働している必要があるプロセスを持つこのアプリケーションがあります。
それらが稼働している場合は機能しますが、稼働していない場合、私の gen_server は init with で失敗し{error,Reason}、これは私のスーパーバイザーを介して私のアプリケーションstart機能に伝播します。
問題は、{ok,Pid} 以外を返すと、クラッシュ レポートが表示されることです。

ここでの私の意図は、アプリケーションが適切に起動できず、すべてのプロセスがダウンしているため、アプリケーションがアクティブであると見なされるべきではないことを何らかの方法で通知することですが、{ok, self()} を返すことしか選択できません。そうでない場合にアプリケーションがリストされているactiveことを確認するか、{error, Error} を返し、次のようにクラッシュする方法を確認します。

{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[rtb_sup,<0.134.0>]},
{messages,[]},{links,[<0.135.0>]},{dictionary,[]},{trap_exit,false},{status,running},
{heap_size,377},{stack_size,24},{reductions,255}],[]]:\n"

問題はこれよりも大きいようです。基本的に、アプリが失敗したことをアプリケーション フレームワークに伝える方法はありません。let the process dieerlang で処理されるものの 1 つに見えるかもしれませんが、{error, }戻り値を許可することapplication:startは良いトレードオフのように思えます。

ヒントはありますか?

4

1 に答える 1

1

アプリケーションはいつでもクラッシュするため、開始時のアプリケーションの依存関係は、有用な動的クラッシュ情報を提供できません。

プロジェクトのソース コードの一部を読む前にrabbitmq、これもクラスター ベースのプログラムです。

あなたが言ったように、クラスターは関連するアプリケーションの「ライブ」情報をrabbitmq収集してから決定する必要があるため、同様の質問に直面したと思います。nodes'smemory water highmark information

その解決策は

  1. rabbit.erlアプリケーションの最初のメイン プロセスをローカル ノードに登録するには、rabbitmq システムの名前は「rabbit」で、ファイルであり、関数「start/2」で見つけることができます。

    start(normal, []) -> case erts_version_check() of ok -> {ok, SupPid} = rabbit_sup:start_link(), true = register(rabbit, self()), print_banner(), [ok = run_boot_step(Step) || Step <- boot_steps()], io:format("~nbroker running~n"), {ok, SupPid}; Error -> Error end.

  2. 残りの 4 つのモジュールrabbit_node_monitor.erl, rabbit_memory_monitor.erl, vm_memory_monitor.erl, rabbit_alarm.erlは、登録されたプロセスの "DOWN" メッセージを取得する監視プロセスと、これらの情報を収集するアラーム ハンドラの 2 つの erlang 手法を使用します。

于 2012-05-25T04:55:45.537 に答える