我正在研究 Erlang Programming 一书中的练习 12-2。我有一个模块db_server_otp实现 OTP gen_server 行为。作为一个独立的模块,我已经对其进行了测试,它可以按预期工作。我现在必须为它添加一个主管。基于本章中的示例,我创建了一个模块db_server_sup,如下所示:
-module(db_server_sup).
-export([start/0,init/1]).
-behavior(supervisor).
start() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init(_Arguments) ->
DbServerOtp = {db_server_otp, %% Id
{db_server_otp, start, []}, %% child process
permanent, %% restart
30000, %% shutdown (ms)
worker, %% type
{db_server_otp}}, %% required modules
{ok,
{{one_for_all, %% terminate all children and restart
5, %% max of n restarts in MaxSeconds
3600}, %% MaxSeconds (s)
[DbServerOtp]}}. %% child process list
两个模块都位于同一个目录中,我用 .beam 文件编译的两个模块位于我启动 erlang shell 的同一个工作目录中。但是,使用 erlang shell,我无法启动主管。
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:8:2] [rq:8] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> c(db_server_otp).
./db_server_otp.erl:5: Warning: undefined callback function code_change/3 (behaviour 'gen_server')
./db_server_otp.erl:5: Warning: undefined callback function handle_info/2 (behaviour 'gen_server')
{ok,db_server_otp}
2> c(db_server_sup).
{ok,db_server_sup}
3> db_server_sup:start().
** exception exit: {start_spec,{invalid_modules,{db_server_otp}}}
我必须导入db_server_otp模块吗?如果是这样,我必须导入哪些功能?我在db_server_otp中导出我所有的 OTP 方法:
-module(db_server_otp).
-export([start/0,stop/0]).
-export([write/2,read/1,delete/1,match/1]).
-export([init/1,terminate/2,handle_cast/2,handle_call/3]).
-behavior(gen_server).