Sel*_*bor 0 erlang thrift erlang-otp erl rebar
我正在构建一个简单的erlang应用程序,并且对环境很新,所以我很难理解我遇到的一些错误.我不确定我的问题的根源在哪里,所以如果有任何相关内容我不发布,请告诉我:
我正在运行的模块的来源:
-module(basilisk_server).
-author("Oak").
-export([start_link/2,start/0,start/1,start/2, stop/1]).
-behaviour(application).
-record(options,{
port = 6890,
server_opts = []
}).
-define(LocalIP,"192.168.64.128").
start()->
start([]).
start(Args)->
#options{port = Port, server_opts = ServerOpts} = parse_args(Args),
spawn(
fun() ->
start_link(Port, ServerOpts),
receive after infinity -> ok end
end)
.
start(_StartType, Args) ->
start(Args).
parse_args(Args) -> parse_args(Args, #options{}).
parse_args([], Opts) -> Opts;
parse_args([Head | Rest], Opts) ->
NewOpts =
case catch list_to_integer(Head) of
Port when is_integer(Port) ->
Opts#options{port = Port};
_Else ->
case Head of
"framed" ->
Opts#options{server_opts = [{framed, true} | Opts#options.server_opts]};
"" ->
Opts;
_Else ->
erlang:error({bad_arg, Head})
end
end,
parse_args(Rest, NewOpts)
.
stop(_State) ->
ok.
start_link(Port, ServerOpts) ->
io:format("Starting server on port ~p with args: ~p~n",[Port,ServerOpts]),
Services =
[
{"AuthenticationService",authenticationService_thrift},
{"UserRegistrationService",userRegistrationService_thrift}
]
,
{ok, _} = thrift_socket_server:start([
{ip, ?LocalIP},
{port, Port},
{name, ?MODULE},
{service, Services},
{handler,[
{"error_handler", thrift_error_handler},
{"AuthenticationService",authentication_service},
{"UserRegistrationService",user_registration_service}
]},
{socket_opts, [{recv_timeout, infinity}]}
]++
ServerOpts).
Run Code Online (Sandbox Code Playgroud)
我application:start(basilisk_server).
按此顺序运行并获取这些消息:
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
<0.38.0>}}}
=INFO REPORT==== 29-Jul-2014::03:11:06 ===
application: basilisk_server
exited: {bad_return,{{basilisk_server,start,[normal,[]]},<0.38.0>}}
type: temporary
=ERROR REPORT==== 29-Jul-2014::03:11:06 ===
Error in process <0.38.0> with exit value: {terminated,[{io,format,
[<0.36.0>,"Starting server on port ~p with args: ~p~n",[6890,[]]],[]},
{basilisk_server,start_link,2,[{file,"src/basilisk_server.erl"},{line,55}]},
{basilisk_server,'-start/1-fun-0-',2,[{file,"src/basilisk_serve...
Run Code Online (Sandbox Code Playgroud)
我遇到的主要问题是确定错误的实际来源.我的印象io:format
是短暂的问题,但我认为这是一个"红鲱鱼",而bad_result是我问题的根源.我以几乎相同的状态运行程序,它正在工作,突然开始出现此错误.我回滚了大部分更改并且没有停止.我也尝试重启,以防后台进程出现问题.
您正在使用application:start
,它希望您的模块遵守该application
行为.
那就是:它会打电话foo:start/2
,告诉你你的应用程序正在启动.你应该回来{ok, Pid}
.这在OTP设计原则的"应用" 章节中有记录.
但是,您的start
函数会立即调用spawn
,并使用其结果.由于spawn
回报率Pid
,而不是{ok, Pid}
,application:start
抱怨在预期的结果不匹配.
这就是你看到的原因bad_return
:
{error,{bad_return,{{basilisk_server,start,[normal,[]]},
<0.38.0>}}}
Run Code Online (Sandbox Code Playgroud)
这告诉你,你有一个error
类型bad_return
.它发生在调用时basilisk_server:start(normal, [])
,它的返回值为<0.38.0>
(一个pid).
哦,另一个错误是因为你使用了start_link
,这意味着你的两个进程是链接的.当一个人死亡时,另一个人将被杀死.这就是你所看到的terminated
.在这种情况下,它碰巧在中间被杀死io:format
; 它可能会在其他运行中被杀之前进一步发展.
此外,假定应用程序启动根管理程序(这是返回的pid用于).
此时,您不需要该application
行为.事实上,我并不相信你需要大部分代码.只需打电话就thrift_socket_server:start
可以了.它将继续在后台运行.
归档时间: |
|
查看次数: |
148 次 |
最近记录: |