Elixir-阻止GenServer处理信息

时间:2017-04-30 06:15:52

标签: rabbitmq elixir gen-server

我有一台GenServer来处理我的Rabbitmq连接 如果连接失败,以下回调会尝试重新连接到服务器:

def handle_info({:DOWN, _, :process, pid, reason},state) do
  Logger.info "Rabbit connection lost"
  {:ok, conn} = open_connection()
  {:noreply, conn}
 end  

GenServer还有一个函数和回调函数,它返回当前连接pid:

def get_current_connection({:ok, app}) do
  {_conn_string , conn, _app} = GenServer.call(app, :get_cuurent_connection})
  {:ok,conn}
 end

def handle_call({:get_cuurent_connection}, _pid, state) do
  {:reply, state , state}
end

我要做的是,一旦DOWN信息被接受(即一旦服务器在上面的句柄信息中) -
应该阻止服务器,并且对其他功能的任何调用(例如,获取当前连接连接)将等待回调完成。
有一种简单的方法吗?

1 个答案:

答案 0 :(得分:2)

GenServers一次只处理一条消息。当您的GenServer处理{:DOWN...消息时,它无法处理其队列中的任何其他消息。基本上该服务器的所有内容都将被阻止"直到你完成处理消息。

如果有人在您处理DOWN时调用get_current_connection,控件将转到GenServer.call并将请求添加到消息队列并等待该消息通过队列。在您完成处理{:DOWN...消息之前,该消息无法移动,因此呼叫者将基本上被阻止,等待您完成重新建立连接。