1

Elixir でアプリを実行できますが、エラーが発生した場合、すべてが存在します。この場合、アプリを再起動したいだけです。スーパーバイザーを使用していますが、機能しているかどうかさえわかりません。以下は私のコードです:-

mix.exs:-

def application do
[ 
  applications: [:httpotion, :zookeeper, :parallel, :poison],
  mod: {ServiceMonitor, []}
]
end

service_monitor.ex

defmodule ServiceMonitor do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
        worker(ServiceMonitor.Registry.setup, []),
    ]

    supervise(children, strategy: :one_for_one)
  end
end

registry.ex

defmodule ServiceMonitor.Registry do

  def setup do
    zk = get_zk
    start(zk)
  end

  def start(zk) do
    #main code
  end
end

今、私はコマンドを使用してアプリを実行しています:-

MIX_ENV=test mix run

メインコードでエラーが発生するまで、すべて正常に動作します。アプリケーションが存在し、再起動しません。私が受け取るエラーは次のとおりです:-

** (Mix) Could not start application service_monitor: exited in: ServiceMonitor.start(:normal, [])
** (EXIT) exited in: Task.await(%Task{owner: #PID<0.164.0>, pid: #PID<0.169.0>, ref: #Reference<0.0.2.1026>}, 3600000)
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: {:error, :no_node}
            (service_monitor) lib/service_monitor/registry.ex:121: anonymous fn/3 in ServiceMonitor.Registry.remove_available_if_not_registered/3
            (elixir) lib/task/supervised.ex:89: Task.Supervised.do_apply/2
            (elixir) lib/task/supervised.ex:40: Task.Supervised.reply/5
            (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3

どこが間違っているのか、親切に助けてください。私の要件は、エラーが発生するとすぐにアプリが自動的に再起動することです。

4

1 に答える 1

0

ServiceMonitorがスーパーバイザー モジュールの場合、このに従ってSupervisorインポートする代わりに使用する必要があります。Supervisor.spec

編集: スーパーバイザーと一緒に行きたい場合はSupervisor.start、例のようにコードの最後に追加してみてください:

defmodule KVServer do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
    # worker(KVServer.Worker, [arg1, arg2, arg3])
    ]

   opts = [strategy: :one_for_one, name: KVServer.Supervisor]
   Supervisor.start_link(children, opts)
 end
end
于 2016-07-26T05:12:27.603 に答える