スーパーバイザーと GenServer を可能な限りシンプルに組み合わせたプロジェクトがあります。iex から呼び出す場合:
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
:mumble 呼び出しで例外が発生し、GenServer が再起動され、2 番目の :echo 呼び出しが正常に機能します。
他の方法でコードを実行すると、Supervisor は GenServer の再起動に失敗します。たとえば、次のようにメイン モジュールを使用してプロジェクトの escript を作成します。
defmodule EchoCmd.Echo do
def main(args) do
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
end
end
:mumble 呼び出しで例外が発生し、Supervisor が GenServer を再起動することなく escript が終了します。
Supervisor モジュールと Server モジュールのコードは含めていません。これらは iex から呼び出されたときに正常に動作するためです。ここでは不要だと思います。
概念的な誤解がありますか? これは不可能ですか、それとも何か間違っていますか?