首页 > 解决方案 > 如何捕获 GenServer 终止 Elixir

问题描述

我有一个DynamicSupervisor基本设置,我正在启动一个子 GenServer 作为

Supervisor.start_child(Recording.WorkerStarter, %{
  id: String.to_atom(detailed_camera.name),
  camera: detailed_camera,
  sleep: detailed_camera.sleep
})

并将其终止为

name
|> Process.whereis()
|> case do
  nil -> :not_found
  pid -> DynamicSupervisor.terminate_child(__MODULE__, pid)
end

我想抓住它的终止,因为当我终止这个孩子时,我想记录一些东西。

我已经测试过terminate/2了,Recording.WorkerStarter但它不会被调用。

我试过handle_info({:DOWN, ref, :process, _, _}, state)它不会工作。

我怎样才能赶上Recording.WorkerStarter终止?

更新:

这是我的工人

defmodule Recording.WorkerStarter do
  use GenServer

  require Logger

  def start_link(opts) do
    IO.inspect("Started Recording.WorkerStarter")
    {id, opts} = Map.pop!(opts, :id)
    GenServer.start_link(__MODULE__, opts, name: id)
  end

  def init(state) do
    schedule_fetch_call(state.sleep)
    {:ok, state}
  end

标签: elixir

解决方案


我假设你:stopinit/1回调中返回。关于GenServer.terminate/2状态的文档:

terminate/2如果回调(除外init/1)[...] ,则调用

也就是说,您可能会从那里经过GenServer.handle_continue/2:stop从那里返回,或者在调用过程中存在陷阱Process.flag(:trap_exit, true)


推荐阅读