Erlang06_OTP 进程监控树_完整的app
总篇:17
编辑于 2025/5/15 20:30
截稿于: 2025/5/15 22:00
简介
定义如下:
需要用到三种行为,查看模块要求的行为(必须实现的函数) M:behaviour_info(callbacks).
gen_event:

gen_server:

supervisor只要求实现init创建进程树的初始化:

本身提供启动监控树服务函数

- 其中调用的是gen_server:start_link/4,指定了注册进程名为supervisor,当节点集群(local|global)中没有其他名为supervisor进程时才注册,也就是只能注册一次。
- 而start_link/3,没有指定进程名参数,是“匿名”进程,只能通过Pid访问。
Supervisor程序
- 编写两个服务,double_server,half_server
- 创建一个one-for-one 监控树程序监控这两个程序,
- half_server参数为0时报错,进程出错,而后立即重启,下次正常调用
double_server.erl:

half_server.erl:

my_supervisor.erl:

- init返回值:
init([]) ->
{ok,
{{one_for_one, 3, 10}, [
{tag1 % 启动的服务的标记,不是名字
, {double_server, start_link, []}, %启动的服务MFA
permanent, %服务挂掉后立即重启
10000, % 服务启动后10000ms后终止,因为上面设置了终止后立即重启,所以感觉没有生效
worker, % 被监控进程的类型 |supervisor,监控进程可以监控另外的监控进程形成监控树
[double_server] %实现了gen_server行为模式的Mod名
},
{tag2, {half_server, start_link, []}, permanent, 10000, worker, [half_server]}
]}}.
测试:

half(0)报错之后仍正常调用:

监控树中各监控进程应该有错误报告模块,这里简单用error_logger:error_msg("Error")表示。
2025/5/16 18:40 -2025/5/16 19:30 续
构建完整的OTP程序
需用到application模块
- 新建一个my_application.app文件:
{application, my_application, [
{description, "My first application"}, %描述
{vsn, "1.0"}, %版本
{modules, [my_application, my_supervisor, double_server, half_server]}, %程序需要载入的模块
{registered, [double_server, half_server, my_supervisor]}, %程序需要注册的服务进程
{applications, [kernel, stdlib]}, %照抄
{mod, {my_app, []}}, %需要实现application行为的模块名
{start_phases, []} %照抄
]}.
- 新建上文中mod部分的my_app
-module(my_app).
-behaviour(application). %实现application行为
-export([start/2, stop/1]).
start(_Type, StartArgs) ->
my_supervisor:start_link(StartArgs).
stop(_State) ->
ok.
现在拥有了一个类似springboot程序的应用了:
先编译全部:

再查看已存在的应用程序

将新建的应用加载进去

启动my_application程序

测试,正常:

停止程序

截至此处的知识,足够构建一个完整的服务器。
浙公网安备 33010602011771号