【发布时间】:2012-05-30 07:23:01
【问题描述】:
所以我有这个应用程序,它有一个进程,需要一些 gen_servers 在集群的其他地方处于活动状态。
如果它们启动了,它就可以工作,如果没有,我的 gen_server 在初始化中失败,{error,Reason},这会通过我的主管传播到我的应用程序 start 函数中。
问题是,如果我返回 {ok,Pid} 以外的任何内容,我会收到崩溃报告。
我的意图是以某种方式表明应用程序无法正常启动并且所有进程都已关闭,因此不应将应用程序视为处于活动状态,但是,我只能选择返回 {ok, self ()} 并查看我的应用程序是否列为active,或者返回 {error, Error} 并查看它是如何崩溃的:
{gen_server,init_it,6},{proc_lib,init_p_do_apply,3}]}},{ancestors,[rtb_sup,<0.134.0>]},
{messages,[]},{links,[<0.135.0>]},{dictionary,[]},{trap_exit,false},{status,running},
{heap_size,377},{stack_size,24},{reductions,255}],[]]:\n"
问题似乎比这个更大,基本上没有办法告诉应用程序框架应用程序失败了。它可能看起来像是由 erlang 中的 let the process die 处理的这些事情之一,但在 application:start 上允许 {error, } 返回值似乎是一个很好的权衡。
有什么提示吗?
【问题讨论】:
-
只是好奇:无法启动(崩溃)的应用程序和启动但无法执行任何操作的应用程序之间有什么区别(对于实际问题)?您是否会对已启动(但失败)的应用程序执行任何操作,例如在这些 gen_servers 启动然后继续执行时进行轮询?你的应用程序无法启动而不是让它在启动时崩溃的“信号”有什么意义?也许您想启动您的应用程序,但等待这些 gen_servers 启动后的事件,以便您可以继续执行
-
最好让应用程序崩溃,使其处于某种奇怪的状态
-
我同意。对启动其他 gen_server 的应用程序创建依赖可能会更好,因此一切都以正确的顺序启动
-
Mod:start/2函数不能在启动树之前先检查必要的服务器是否正在运行,如果没有则返回{error,Reason}。这意味着将智能移出应用程序服务器,这可能是一件坏事。 -
@marcelog 如果应用程序已启动但无法执行任何操作(因为进程不存在),它仍会显示在 application:which_applications() 中,我在管理层经常使用它来检查对于已启动的应用程序。如果应用程序无法启动,我可以随时将其登录到我的管理层并明显显示它没有启动。
标签: crash erlang erlang-otp