一段时间后如何重新启动崩溃的受监管进程?

时间:2018-07-10 18:15:03

标签: elixir gen-server

我有一个简单的基于GenServer的应用程序,该应用程序可以解析网页并处理从网页获取的数据。代码大致如下:

def start_link do
  GenServer.start_link(__MODULE__, %{})
end

def init(state) do
  schedule_work(1)
  {:ok, state}
end

def handle_info(:work, state) do
  // Request webpage using HTTPoisson
  // Parse data using Floki
  // Use it

  schedule_work(10 * 60) # Reschedule after 10 minutes
  {:noreply, state}
end

defp schedule_work(timeout) do
  Process.send_after(self(), :work, timeout * 1000)
end

今天,第三方站点停止提供正确的标记已有一段时间,解析失败并导致GenServer崩溃。主管重新启动它,它立即崩溃。 :max_restarts之后,主管最终停止了该应用程序。

我不想简单地增加:max_restarts。有没有办法告诉Supervisor在一定时间后尝试重新启动?还是我应该在解析代码中进行更多的错误处理,以防止该过程首先崩溃(我认为这会违背“让它崩溃”的理念)?

1 个答案:

答案 0 :(得分:1)

我想说的最好的办法是同时更好地处理错误和崩溃。

您提到您不想简单地增加max_restarts选项。您也可以降低max_seconds option(默认值为5)。

此外,您可以使用Process.flag(:trap_exit, true)来捕获exits,并且在解析错误的情况下,退出并显示一条特定消息(例如Process.exit(pid, :bad_parsing),然后使用该消息来重新安排时间。这可能几乎不需要但是,您监督事情的方式到处都会改变。