2
だから私はループで動作し、特定の操作を実行するエリクシルプログラムを持っています。私はエージェントに、単一の飼育係の接続インスタンスを作成し、それをループ内で使用するように宣言しました。私のコードは以下の通りです: -エリクサーのループでエージェントが返した値を使用できません
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
今、zkのPIDを表示すると、常に同じものが得られます。つまり、zkの同じインスタンスが常に返されます。私はいつもの代わりにエージェントからの参照のループでZKを初期化する場合にも、私のコードは正常に動作している
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>}
- :。しかし、私は次のエラーを取得しています
PS: - それを再現するために、あなたは私が間違って作成されたプロセスのためのループを実行していたようだ飼育係のセットアップ
'get_zk/0'に' zk'を返すのですか? '{:ok、zk} = ZK.start(@zk_quorams)' - > '{:ok、zk} = ZK.start(@zk_quorams); zk'?それでも問題が解決しない場合は、[MCVE](http://stackoverflow.com/help/mcve)に投稿してください。 – Dogbert
get_zk/0に 'zk'を返すことで解決できません。 MCVEを投稿しました。 –
'ZK.get_children(zk、"/test ")'を 'ZK.get_children(Agent.get(zk、&(&1))、"/test ")'に変更してみてください。 – Dogbert