سؤال

أنا بناء تطبيق إرلانغ بسيط وجديد جدا إلى إنفيورنمنت ، لذلك أواجه مشكلة في جعل الشعور ببعض الأخطاء أنا الحصول عليها.لست متأكدا من أصل مشكلتي هنا ، لذلك إذا كان هناك أي شيء ذي صلة لا أنشره ، فيرجى إبلاغي بذلك:

مصدر للوحدة أنا على التوالي:

  -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}.تم توثيق هذا في "التطبيقات" الفصل من مبادئ تصميم مكتب المدعي العام.

ومع ذلك ، لديك 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> (بيد).

أوه ، والخطأ الآخر هو لأنك استخدمت start_link, ، مما يعني أن العمليتين مرتبطتان.عندما يموت أحدهما ، سيقتل الآخر.هذا هو ما ترونه مع terminated.في هذه الحالة ، حدث أن قتل في منتصف io:format;قد تجعل من أبعد من ذلك قبل أن يقتل في أشواط أخرى.

وعلاوة على ذلك ، يفترض تطبيق لبدء المشرف الجذر (وهذا هو ما بيد عاد ل).

في هذه المرحلة ، لا تحتاج إلى application السلوك.في الواقع ، أنا لست مقتنعا بأنك بحاجة إلى معظم التعليمات البرمجية الخاصة بك على الإطلاق.فقط اتصل thrift_socket_server:start وينبغي القيام به معها.سيستمر تشغيله في الخلفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top