【问题标题】:'handle_call' getting timed out“handle_call”超时
【发布时间】:2014-10-01 10:21:17
【问题描述】:

我正在从 GenServer 中的句柄信息函数调用 elixir genserver 以添加电话号码获取表单客户端。但是一旦调用了handle_call,所有者进程就会崩溃[超时]。请帮忙。

在调用任何下述函数之前,已全局创建一个 ETS 以插入值。

def handle_info(message, state) do

    {a,b} = message
    phonenumber = b[:body] 
    add phonenumber
    {:noreply, state}
end

def add(phonenumber) do
    GenServer.call(__MODULE__, {:add, phonenumber})
end


def handle_call({:add, phonenumber}, from, state) do

    :ets.insert(:access_table, {:details, phonenumber})
    reply = {:ok, "Added #{phonenumber} to profile"}
    new_state = [{username} | state]
    {:reply, reply , new_state}
end

错误:

** When Server state == []
** Reason for termination == 
** {timeout,{gen_server,call,['Elixir.Bankrecord',{add,"346534543534"},5000]}}
** (EXIT from #PID<0.150.0>) exited in: :gen_server.call(Bankrecord, {:add, '346534543534'}, 5000)
** (EXIT) time out

【问题讨论】:

    标签: elixir gen-server


    【解决方案1】:

    您不能在通话中给自己打电话,就像在您的 handle_info 调用 add 中一样,它会在您的 gen_server 上执行回调。由于所有操作都在 gen_server 中按顺序发生,因此您最终会阻止自己。解决方案应该是在模块上使用一个简单的私有 add 函数,并同时将 handle_infohandle_call({:add 委托给它。

    def add(phonenumber) do
      GenServer.call(__MODULE__, {:add, phonenumber})
    end
    
    def handle_info({_, message}, state) do
      add_number message[:body]
      {:noreply, state}
    end
    
    
    def handle_call({:add, phonenumber}, from, state) do
      add_number phonenumber
      {:reply, {:ok, "Added #{phonenumber} to profile"} , [{username} | state]}
    end
    
    defp add_number(phonenumber) do
      :ets.insert(:access_table, {:details, phonenumber})
    end
    

    【讨论】:

    • 谢谢克里斯,您是否可以分享一些代码示例来解决我的问题,因为我是 elixir 中的新手。非常感谢。
    • 我添加了一个函数委托的例子
    • 像魅力一样工作,仍然是最后一个查询 Chris [如果你能帮忙的话]。只是想当我的 handle_info 没有返回任何内容时,如何使用 handle_call 从 ETS 将更新的电话号码列表发送回客户端。只是有点困惑,无法理解 genserver 的流程。
    猜你喜欢
    • 2017-01-13
    • 2016-04-03
    • 2019-03-27
    • 2020-08-18
    • 2019-01-03
    • 2019-12-17
    • 1970-01-01
    • 2012-04-14
    • 2016-12-17
    相关资源
    最近更新 更多