【发布时间】:2017-08-12 23:16:06
【问题描述】:
假设我有GenServer 实例:
defmodule MyModule do
use GenServer
def init(_) do
{:ok, %{}}
end
#...
end
我希望 MyModule 受到监督,但是当它崩溃时,在它以崩溃前的状态重新启动之前做一些事情:
defmodule MyModule do
use GenServer
def init(_) do
{:ok, %{}}
end
def init(:restart, previous_state) do
some_func(previous_state)
{:ok, previous_state}
end
#...
end
但我不确定如何实现这一点
【问题讨论】:
-
您可以使用
terminate/2回调并将状态存储在其他地方(代理、数据库、ETS)并将其加载到init/1但我认为您不能让主管通过旧状态自动重启。 -
你想用那个状态做什么?除了日志记录之外,我无法想象同一个 genserver 会重用它的旧状态而导致它崩溃的用例。如果您收到类似的消息,它不会立即再次崩溃吗?崩溃向主管发送错误消息。你可能会抓住它并用它做点什么。否则使用 Dogbert 建议的方法将状态存储在某处,并在 genserver 重新启动时从那里加载它。
-
@Johannes 我会说,在我的情况下,不是状态本身会导致崩溃,但是通过对该状态应用无效调用会引发异常
-
如果这些是有效异常,为什么不直接从调用中的异常中恢复?
标签: erlang elixir erlang-otp