我有一台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信息被接受(即一旦服务器在上面的句柄信息中) -
应该阻止服务器,并且对其他功能的任何调用(例如,获取当前连接连接)将等待回调完成。
有一种简单的方法吗?
答案 0 :(得分:2)
GenServers
一次只处理一条消息。当您的GenServer处理{:DOWN...
消息时,它无法处理其队列中的任何其他消息。基本上该服务器的所有内容都将被阻止"直到你完成处理消息。
如果有人在您处理DOWN时调用get_current_connection
,控件将转到GenServer.call
并将请求添加到消息队列并等待该消息通过队列。在您完成处理{:DOWN...
消息之前,该消息无法移动,因此呼叫者将基本上被阻止,等待您完成重新建立连接。