Rabbitmq Elixir-在处理信息时阻止GenServer
我有一个GenServer,负责我的Rabbitmq连接。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
如果连接失败,以下回调将尝试重新连接到服务器:
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之前接收到断开回调,因此它尝试打开一个到旧连接的通道,而旧连接在此之前已断开:(