添加了一个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发送退出消息来杀死应用程序。

链接地址: http://www.djcxy.com/p/38245.html

上一篇: Added supervisor(s) for a gen

下一篇: server is up?