2016-07-25 39 views
1

Ich kann eine App auf Elixir ausführen, aber wenn ein Fehler auftritt, existiert alles. Ich möchte nur, dass meine App in diesem Fall neu startet. Ich benutze Supervisor, weiß aber nicht, ob es funktioniert. Es folgt mein Code: -Starten einer App mit Supervisor in Elixir, die bei Fehler automatisch neu starten würde

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 

Jetzt leite ich meine App die Befehl: -

MIX_ENV=test mix run 

Es läuft alles gut, bis ich einen Fehler in meinem Hauptcode erhalte. Anwendung existiert und startet nie neu. Error i receive ist: -

** (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 

Bitte helfen, wo ich falsch liege. Meine Anforderung ist, dass die App automatisch neu gestartet werden sollte, sobald ein Fehler auftritt.

+0

Hat diese Arbeit: 'Arbeiter (Servicemonitor. Registrierung, [], Funktion:: Setup) '? Wenn nicht, können Sie bitte den Inhalt von 'ServiceMonitor.Registry.start/1' posten? – Dogbert

+0

nein dies gibt auch den gleichen Fehler. Start-Funktion ist wie folgt: - 'def (zk) beginnen tun #Some Code Start (zk) end' Im Grunde ist es eine Endlosschleife –

Antwort

0

Wenn ServiceMonitor Ihr Supervisor-Modul ist, sollte es Supervisor anstelle von Supervisor.spec nach this verwenden.

bearbeitet: Wenn Sie noch mit Ihren Vorgesetzten gehen wollen, versuchen Supervisor.start am Ende des Codes zu schreiben, gerade in Beispiel:

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 
+0

Wenn ich das tue, sagt er' ** (CompileError) lib /service_monitor.ex:11: undefined function worker/3' –

+0

Entferne diese 'use Application' und füge stattdessen' use Supervisor' ein. Sie sollten Supervisor.spec auch nicht in die Funktion importieren. Der Name der Funktion, in der 'worker/3 'aufgerufen wird, sollte' init' sein. – PatNowak

+0

Wenn ich jetzt meine App mit 'MIX_ENV = Testmix run' starte, erhalte ich den Fehler: - ' ** (Mix) Die Anwendung konnte nicht gestartet werden service_monitor: exited in: ServiceMonitor.start (: normal, []) * * (EXIT) eine Ausnahme ausgelöst wurde: ** (UndefinedFunctionError) nicht definierte Funktion ServiceMonitor.start/2' –