为什么没有" start_monitor"对于gen_server?

时间:2018-02-20 08:49:36

标签: erlang monitor otp gen-server

为什么没有start_monitor作为spawn_monitor的等价物有什么特别原因吗?

这是不需要的,因为gen_servers通常由主管启动?

我想在临时员工崩溃时收到通知。在OTP应用程序中执行此操作的建议方法是什么? 第一个想法是拥有一个gen_server来监控由一个充满活力的主管开始的工人。

更多信息:

据我所知,主管在发生崩溃时提供受控启动,关机和受控重启(以恢复到良好定义的状态)。 除此之外,我想在工作进程崩溃时运行一个函数。

例如,我有一个连接到Erlang节点的C节点。由于C节点不能监视进程(AFAIK)并且在其他方​​面也限制它如何与Erlang交互,因此我有一个"代理"连接C节点以保持C节点尽可能简单的过程。

C节点使用ei_rpc_to对Erlang进行rpc调用,并处理来自连接的Erlang节点的消息。消息可以是rpc调用的结果,也可以是"带外" C节点的数据/信息。

Erlang"代理"进程使用monitor_node监视其C节点以检测它是否消失,但我还需要一种机制来通知C节点其代理进程崩溃。检测这种情况的一种方法是当它进行下一次rpc调用时,因为它显然会失败,但是因为我已经拥有了#34;带外"消息处理到位,我想用它。

其他用例是让客户端向Erlang集群发出REST请求。这反过来启动执行某些任务的工作人员(这可能需要很长时间)。一段时间后,外部客户端可能想要获取任务的状态。例如,工作人员可以更新Mnesia表中的状态,但如果崩溃,谁将使用失败状态更新表。

我知道有很多方法可以达到这个目的,但我想知道Erlang的做法是什么。

第二次编辑:

在阅读文档后,我看到在gen_server中,terminate将被调用(如果它是使用匹配子句定义的)。这是否是单独监控过程的可行选择?这看起来有点混乱,因为terminate在接收' EXIT'时未被调用。从其他进程,所以我还需要陷阱退出

0 个答案:

没有答案