문제

저는 간단한 얼랭 애플리케이션을 구축 중이고 환경에 매우 익숙하지 않기 때문에 발생하는 일부 오류를 이해하는 데 어려움을 겪고 있습니다.내 문제의 근본 원인이 여기에 있는지 잘 모르겠습니다. 따라서 게시하지 않은 내용이 있으면 알려 주시기 바랍니다.

내가 실행 중인 모듈의 소스:

  -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).

난 달린다 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... 

내가 겪고 있는 주요 문제는 오류의 실제 원인을 식별하는 것입니다.나는 그런 인상을 받았다. io:format 잠시 동안 문제가 되었지만 나는 그것이 "붉은 청어"였고 그 나쁜 결과가 내 문제의 근원이라고 믿습니다.거의 동일한 상태로 프로그램을 실행했는데 작동 중이었는데 갑자기 이 오류가 발생하기 시작했습니다.대부분의 변경 사항을 롤백했는데 멈추지 않았습니다.백그라운드 프로세스에 문제가 있을까봐 재부팅도 해보았습니다.

도움이 되었습니까?

해결책

당신은 사용하고 있습니다 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>}}}

이것은 당신이 error, 유형 bad_return.전화하다가 일어난 일 basilisk_server:start(normal, []), 그리고 반환 값은 다음과 같습니다. <0.38.0> (pid).

아, 그리고 또 다른 오류는 당신이 start_link, 이는 두 프로세스가 연결되어 있음을 의미합니다.한 사람이 죽으면 다른 사람도 죽게 됩니다.이것이 당신이 보고 있는 것입니다. terminated.이번 경우에는 도중에 사망하게 되었습니다. io:format;다른 실행에서 죽기 전에 더 많은 것을 만들 수 있습니다.

또한 애플리케이션은 루트 감독자를 시작한다고 가정합니다(반환된 pid는 이에 대한 것입니다).

이 시점에서는 application 행동.사실, 나는 대부분의 코드가 필요하다고 확신하지 않습니다.그냥 전화해 thrift_socket_server:start 그리고 끝내세요.백그라운드에서 계속 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top