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
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
Kann nicht gelöst werden, indem 'zk' in get_zk/0 zurückgegeben wird. Habe einen MCVE gepostet. –
Versuchen Sie auch 'ZK.get_children (zk "/ test")' auf 'ZK.get_children (Agent.get (zk, & (& 1)), "/ test")' ändern. – Dogbert