Rabbitmq Elixir-在处理信息时阻止GenServer

Rabbitmq Elixir-在处理信息时阻止GenServer,rabbitmq,elixir,gen-server,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

我有一个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的信息(即,一旦服务器位于上面的句柄信息中)-
服务器应该被阻止,对其他函数的任何调用(例如获取当前连接)都将等待回调完成。

有没有简单的方法可以做到这一点???

genserver
一次只处理一条消息。当您的GenServer正在处理
{:DOWN…
消息时,它无法处理其队列中的任何其他消息。在您完成处理消息之前,该服务器的所有内容都将被“阻止”


如果有人在您处理关闭时调用
get\u current\u connection
,则控制权将传递到
GenServer。调用
,将请求添加到消息队列,并等待该消息通过队列工作。在您完成
{:关闭…
消息,因此在等待您完成重新建立连接时,呼叫方基本上会被阻止。

这对您来说不是自动发生的吗?一旦调用了
handle\u info
,所有
GenServer.call之后进行的调用都会被阻止,直到
handle\u info
返回。GenServer只能是e一次执行一个函数。@Dogbert,你是对的,这是我的错误。我刚刚意识到我的问题是,另一个负责RMQ通道的服务器在调用连接断开callback之前接收到断开回调,因此它尝试打开一个到旧连接的通道,而旧连接在此之前已断开:(