2017-08-30 5 views
0

ich eine application.ex haben, die wie folgt aussieht:Phoenix: Betreuer ignoriert Name, neue Prozesse

defmodule Qtrain.Application do 
    use Application 

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

    children = [ 
     supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor), 
     supervisor(Qtrain.Requests, [], name: Qtrain.Requests) 
    ] 

    Supervisor.start_link(children, strategy: :one_for_one) 
    end 

    def config_change(changed, _new, removed) do 
    QtrainWeb.Endpoint.config_change(changed, removed) 
    :ok 
    end 
end 

Und ein requests.ex die wie folgt aussieht:

defmodule Qtrain.Requests do 
    use GenServer 
    alias Qtrain.Requests.Document 

    def start_link do 
    GenServer.start_link(__MODULE__, %{}) 
    end 

    def init(state) do 
    schedule_work() 
    {:ok, state} 
    end 

    def handle_info(:work, state) do 
    Document.start_link %{id: :one} 
    schedule_work() 
    {:noreply, state} 
    end 

    defp schedule_work() do 
    Process.send_after(self(), :work, 1 * 1000) 
    end 
end 

Wenn ich meine app starten und run :observer.start Ich kann die Aufgabe mit einem :one Schlüssel wie erwartet sehen, aber es gibt zwei Dinge falsch. Einer, der Mutter Supervisor hat keinen Namen trotz mir eine Angabe und zwei nachfolgende in iex -S mix schöpfenden Prozesse wie folgt:

Qtrain.Requests.Document.start_link %{id: :dammit} 

ergeben keine Prozesse unter dem pid hinzugefügt werden.

:observer.start

Aber, sie in der Registerkarte Prozesse angezeigt:

proc

Gibt es Gründe, warum ich nicht, dass die Betreuer benennen kann? Und warum erscheinen neue Prozesse nicht darunter?

Antwort

3
  1. Vorbei an den name Optionen Supervisor.Spec.supervisor/3 hat keine Wirkung in beiden Fällen (prüfen, ob observerEndpoint für den Endpunkt zeigt, während name-Supervisor gesetzt ist.) In der Tat gibt sogar no option name understood ist. Sie sollten den Namen im folgenden Aufruf GenServer.start_link(__MODULE__, %{}, name: __MODULE__) festlegen, der erforderlich ist, damit er in observer angezeigt wird.

  2. Whatever.start_link macht einen gestarteten Prozess nicht zu einem Teil des Überwachungsbaums. Sie sollten es explizit ein Kind des jeweiligen Vorgesetzten zu sein mit Supervisor.start_child/2 (wenn die Eltern ein Vorgesetzter ist, nicht Ihr Fall) oder rufen Sie einfach Document.start_link von innerhalb des jeweiligen GenServer Prozess, since

start_link Startet einen GenServer Prozess verbunden mit dem aktuellen Prozess.

Beispiel:

defmodule Qtrain.Requests do 

    # interface 
    def document!(id) do 
    GenServer.call(__MODULE__, {:document, id}) 
    end 

    def handle_call({:document, id}, _from, state) do 
    Qtrain.Requests.Document.start_link %{id: id} 
    end 

    ... 
end 

Und jetzt:

Qtrain.Requests.document! :damnit 

würde ein Document einen Teil der Aufsicht Baumes machen, da sie den Requests Prozess verknüpft werden. Wenn Sie es gerade von der Konsole aus gestartet haben, wurde es mit dem Prozess mix verknüpft.

+0

Nun, ich hätte nicht eine gründlichere Antwort verlangen können. Vielen Dank! Ich ziehe eine Sidekiq-App von Rails und versuche mein Glück bei OTP. –

+1

Viel Glück dann! Ich persönlich fand es sehr unkompliziert und, ehrlich gesagt, aufregend, aufgrund vieler Dinge von Rubin zu Elixier zu wechseln (speziell OTP). – mudasobwa

Verwandte Themen