2016-09-08 4 views
2

So habe ich Elixier Programm zurückgegeben verwenden, die in einer Schleife läuft und bestimmte Operationen durchzuführen. Ich habe einen Agenten zum Erstellen einer einzelnen Zoowiederverbindungsinstanz deklariert und dann in der Schleife verwendet. Es folgt mein Code: -kann nicht den Wert von Agenten in einer Schleife in Elixier

mix.exs

def application do 
[ 
    applications: [:logger, :zookeeper], 
    mod: {ServiceMonitor, []} 
] 

end  

defp deps do 
[ 
    {:zookeeper, github: "vishnevskiy/zookeeper-elixir"} 
] 
end 

service_monitor.ex

defmodule ServiceMonitor do 
    def start(_type, _args) do 
    {:ok, zk_agent} = Agent.start_link(fn -> ServiceMonitor.Registry.get_zk end) 
    ServiceMonitor.Registry.start_process(zk_agent) 
    end 
end 

service_monitor/registry.ex

defmodule ServiceMonitor.Registry do 
    alias Zookeeper.Client, as: ZK 
    def start_process(zk) do 

    pid = spawn_link(fn -> 
     {:ok, data} = ZK.get_children(zk, "/test") 
     IO.inspect(data) 
    end) 

    start_process(zk) 

    end 

    def get_zk do 
    {:ok, zk} = ZK.start("localhost:2181") 
    zk 
    end 
end 

Nun, wenn ich die PID des ZK drucke, bekomme ich immer das gleiche, was bedeutet, dass immer dieselbe Instanz von zk zurückgegeben wird. Aber ich bin immer folgende Fehlermeldung: -

12:44:39.647 [error] GenServer #PID<0.165.0> terminating 
** (stop) bad call: #Operation performed by zk 
(elixir) lib/gen_server.ex:420: Agent.Server."handle_call (overridable 1)"/3 
(stdlib) gen_server.erl:629: :gen_server.try_handle_call/4 
(stdlib) gen_server.erl:661: :gen_server.handle_msg/5 
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3 
Last message: # 
State: {:ok, #PID<0.166.0>} 

Auch wenn ich immer die zk in Schleife initialisieren, anstatt von dem Agenten der Referenzierung, mein Code funktioniert gut.

PS: - es reproduzieren müssen Sie eine zookeeper Setup haben

+0

Meinten Sie, 'zk' in' get_zk/0' zurückzugeben? '{: ok, zk} = ZK.start (@zk_quorams)' -> '{: ok, zk} = ZK.start (@zk_quorams); zk'? Wenn das nicht funktioniert, könntest du bitte einen [MCVE] (http://stackoverflow.com/help/mcve) posten? – Dogbert

+0

Kann nicht gelöst werden, indem 'zk' in get_zk/0 zurückgegeben wird. Habe einen MCVE gepostet. –

+0

Versuchen Sie auch 'ZK.get_children (zk "/ test")' auf 'ZK.get_children (Agent.get (zk, & (& 1)), "/ test")' ändern. – Dogbert

Antwort

0

Es scheint, dass ich falsch war die Schleife für den erzeugten Prozess ausgeführt wird. Dogberts Lösung, wie man den vom Agenten in der Schleife zurückgegebenen Wert erhält, hat tatsächlich funktioniert. Jetzt führe ich die Schleife auf dem erzeugten Prozess wie folgt aus: -

def start_process(zk_agent) do 
    spawn(ServiceMonitor.Registry, :start,[zk_agent]) 
    :timer.sleep(@sleep_time) 
    start_process(zk_agent) 
end 

def start_process(zk_agent) do 
    zk = Agent.get(zk_agent, &(&1)) 
    #Other logics 
end 
Verwandte Themen