添加了一个gen的主管
编辑:下面。
为什么我监督的gen_server如此快速地关闭?
我会给这些组织名称,使其更清楚我的应用程序中需要的命令链:首先,我先从“assembly_line_worker”开始,然后再将“marketing_specialist”添加到我的监督树中。
ceo_supervisor.erl
-module(ceo_supervisor).
-behaviour(supervisor).
-export([start_link/1]).
-export([init/1]).
start_link(State) ->
supervisor:start_link({local,?MODULE}, ?MODULE, [State]).
init([Args]) ->
RestartStrategy = {one_for_one, 10, 60},
ChildSpec= {assembly_line_worker_supervisor,
{assembly_line_worker_supervisor, start_link, [Args]},
permanent, infinity, supervisor, [assembly_line_worker_supervisor]},
{ok, {RestartStrategy, [ChildSpec]}}.
assembly_line_worker_supervisor.erl
-module(assembly_line_worker_supervisor).
-behaviour(supervisor).
-export([start_link/1]).
-export([init/1]). %% Internal
start_link(State) ->
supervisor:start_link({local, ?MODULE}, ?MODULE, [State]).
init([Args]) ->
RestartStrategy = {one_for_one, 10, 60},
ChildSpec = {assembly_line_worker, {assembly_line_worker, start_link, [Args]}, permanent,
infinity, worker, [assembly_line_worker]},
{ok, {RestartStrategy, [ChildSpec]}}.
assembly_line_worker.erl
-module(assembly_line_worker).
...
init([State]) ->
process_flag(trap_exit, true),
{ok, State}.
start_link(State) ->
gen_server:start_link({global, ?MODULE}, ?MODULE, [State], []).
handle_cast(...,State} ->
io:format("We're getting this message.~n",[]),
{noreply, State};
...
发生的情况是流水线工作人员会执行一些工作,比如接收到一些在ceo_supervisor命令刚刚发送后发送的消息:start_link(#innovative_ideas {})命令被调用,然后关闭。 有什么想法为什么? 我知道gen_server正在接收几条消息,因为它将io格式化为控制台。
谢谢!
编辑 :我通过erlsrv.exe在Windows上托管这个,我发现当我通过像这样的函数启动我的程序时:
start() ->
ceo_supervisor:start_link(#innovative_ideas{}),
assembly_line_worker:ask_for_more_pay(), %% Prints out "I want more $$$" as expected,
ok.
...此功能立即退出,导致我的主管/ gen_servers关闭。 我期待这一点,因为所有这些都通过监督与原来的调用过程相联系,所以当这种情况退出时,孩子们应该如此。
所以我想一个更好的问题是,如何让我的主管在完成所有启动配置后继续运行? 除了将所有这些包装在应用程序中之外,是否还有其他选择? (这听起来不错...)
感谢您提出的问题! 我以这种方式了解到更多关于主管
蝙蝠侠
要获得更多关于正在发生的事情的信息,请在启动监督员之前先启动sasl:application:start(sasl)。
另一种调试方法是从erlang shell启动worker,发送使服务器崩溃的消息序列。 顺便说一句:你确定你需要2级主管?
一些即时评论:
在ceo_supervisor:init/1
您的主管子规范应该声明transient
而不是permanent
。
运行erl -boot start_sasl
以便在出现问题时收到错误日志,并且可以获取崩溃报告。
如果你在shell中运行它,并且犯了错误,那么你的树会被强行杀死。 这是因为你链接到了shell并且shell在出错时崩溃了。 所以你拖着你的树。 试试像这样:
Pid = spawn(fun() -> my_app:start() end).
所以你有它分开。 您可以通过向Pid
发送退出消息来杀死应用程序。
上一篇: Added supervisor(s) for a gen
下一篇: server is up?