8

GenServerのハンドル情報関数からelixir genserverを呼び出して、フォームクライアントから電話番号を取得しています。しかし、handle_call が呼び出されるとすぐに、所有者プロセスがクラッシュします [タイムアウト]。助けてください。

1 つの 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
4

1 に答える 1

7

addgen_serverでコールバックを実行するhandle_info呼び出しのように、呼び出し内から自分自身を呼び出すことはできません。すべての操作は 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
于 2014-08-08T02:24:51.507 に答える