补偿one_for_one主管无法重启子进程:tcp / ip端口侦听器

时间:2011-11-04 19:40:39

标签: erlang supervisor

我创建了一个封装tcp / ip功能的通用行为。行为的所有用户都必须实现回调,这些回调处理来自套接字另一端的任何内容的解析“命令”。

我的通用behvour创建一个端口侦听器进程,通过gen_tcp:accept侦听端口。当有人连接到端口时,端口侦听器要求管理员启动新的端口侦听器,同时继续处理与刚连接的任何客户端的套接字通信。因为每个端口侦听器/套接字处理程序都是动态创建且相同的,所以我使用simple_one_for_one管理程序来创建它们。标准的东西。

这是我的问题。如果端口侦听进程终止,则整个behivour都不起作用,因为没有任何东西可以监听端口。由于port_ listener是由simple_one_for_one管理员创建的,管理员无法重新启动新的port_listener。

那么,我是否创建了一个keep_alive进程来监视“最新”端口侦听器并要求superviosr在它死亡时启动另一个?或者,对于这种情况,还有其他一些最好的做法。

此外,有没有办法查看/检查此行为正在创建的进程?它不是一个应用程序,所以appmon在这里不起作用。

谢谢

1 个答案:

答案 0 :(得分:1)

您可能只能使用一个侦听器进程,因为您始终可以通过

将套接字所有权传输到另一个进程
gen_tcp:controlling_process(Socket, Pid)

然后你的听众也能。

然后你不会被迫在顶级 simple_one_for_one 主管,而是 one_for_one 。或者你认为应该更合适。然后,顶级主管将使用 simple_one_for_one 策略生成监听程序进程和接受程序主管。然后,如果为什么(如果你愿意的话)失败,肯定会重新启动听众。

此外,您可以咨询cowboy项目,了解作者使用的方法。