2016-09-08 1 views
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: - それを再現するために、あなたは私が間違って作成されたプロセスのためのループを実行していたようだ飼育係のセットアップ

+0

'get_zk/0'に' zk'を返すのですか? '{:ok、zk} = ZK.start(@zk_quorams)' - > '{:ok、zk} = ZK.start(@zk_quorams); zk'?それでも問題が解決しない場合は、[MCVE](http://stackoverflow.com/help/mcve)に投稿してください。 – Dogbert

+0

get_zk/0に 'zk'を返すことで解決できません。 MCVEを投稿しました。 –

+0

'ZK.get_children(zk、"/test ")'を 'ZK.get_children(Agent.get(zk、&(&1))、"/test ")'に変更してみてください。 – Dogbert

答えて

0

を持っている必要があります。ループ内のエージェントによって返された値を取得する方法に関するDogbertのソリューションは、実際に働いていました。今、私は生成されたプロセスのループを次のように実行しています: -

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 
関連する問題