Elixir- 在处理信息时阻止 GenServer
Elixir- Block GenServer while handling info
我有一个 GenServer 负责我的 Rabbitmq 连接。
如果连接失败,以下回调会尝试重新连接到服务器:
def handle_info({:DOWN, _, :process, pid, reason},state) do
Logger.info "Rabbit connection lost"
{:ok, conn} = open_connection()
{:noreply, conn}
end
GenServer 还有一个函数和回调,returns 当前连接 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 信息被接受(即一旦服务器在上面的句柄信息中)-
服务器应该被阻塞,任何对其他函数的调用(例如获取当前连接)将等待回调完成。
有没有简单的方法可以做到这一点??
GenServers
一次只处理一条消息。当您的 GenServer 正在处理 {:DOWN...
消息时,它无法处理其队列中的任何其他消息。基本上该服务器的所有内容都将 "blocked" 直到您处理完消息。
如果有人在您处理 DOWN 时调用 get_current_connection
,控制权将传递给 GenServer.call
并将请求添加到消息队列并等待该消息通过队列处理。在您处理完 {:DOWN...
消息之前,该消息无法移动,因此调用者基本上会被阻塞,等待您完成重新建立连接。
我有一个 GenServer 负责我的 Rabbitmq 连接。
如果连接失败,以下回调会尝试重新连接到服务器:
def handle_info({:DOWN, _, :process, pid, reason},state) do
Logger.info "Rabbit connection lost"
{:ok, conn} = open_connection()
{:noreply, conn}
end
GenServer 还有一个函数和回调,returns 当前连接 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 信息被接受(即一旦服务器在上面的句柄信息中)-
服务器应该被阻塞,任何对其他函数的调用(例如获取当前连接)将等待回调完成。
有没有简单的方法可以做到这一点??
GenServers
一次只处理一条消息。当您的 GenServer 正在处理 {:DOWN...
消息时,它无法处理其队列中的任何其他消息。基本上该服务器的所有内容都将 "blocked" 直到您处理完消息。
如果有人在您处理 DOWN 时调用 get_current_connection
,控制权将传递给 GenServer.call
并将请求添加到消息队列并等待该消息通过队列处理。在您处理完 {:DOWN...
消息之前,该消息无法移动,因此调用者基本上会被阻塞,等待您完成重新建立连接。