我有一个尽可能简单的主管和 GenServer 的混合项目。当我从 iex 打电话时:
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
:mumble 调用引发异常,然后 GenServer 重新启动,第二个 :echo 调用正常。
如果我以任何其他方式运行代码,Supervisor 将无法重新启动 GenServer。例如,我使用主模块创建项目的 escript,如下所示:
defmodule EchoCmd.Echo do
def main(args) do
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
end
end
:mumble 调用引发异常,并且 escript 终止,而 Supervisor 没有重新启动 GenServer。
我没有包含 Supervisor 和 Server 模块代码,因为它们在从 iex 调用时工作正常,所以我猜这里不需要它们。
我有概念上的误解吗?这是不可能的,还是我做错了什么?