Question

Je suis en train de construire un simple erlang application et très nouvelle pour l'environnement, donc je vais avoir du mal à faire sens de certaines erreurs que je reçois.Je ne suis pas sûr de ce que la racine de mon problème est ici, donc si il y a quelque chose que je ne poste pas, s'il vous plaît laissez-moi savoir:

Source pour le module, je suis en cours d'exécution:

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

- Je exécuter application:start(basilisk_server). et de faire passer ces messages dans cet ordre:

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

Le principal problème que je vais avoir est d'identifier la source de l'erreur.J'étais sous l'impression que io:format le problème, pour un court moment, mais je crois que c'était un "hareng rouge" et que bad_result est la racine de mon problème.J'ai couru le programme quasiment identiques état et qu'il travaillait, et tout à coup commencé à avoir cette erreur.J'ai roulé en arrière, la plupart des changements et il n'a pas arrêté.J'ai aussi essayé de redémarrer, dans le cas où il avait un problème avec un processus d'arrière-plan.

Était-ce utile?

La solution

Vous êtes à l'aide de application:start, qui s'attend à ce que le module d'adhérer à la application comportement.

C'est:il fera appel foo:start/2, pour vous dire que votre demande de départ.Vous êtes de retour prévue {ok, Pid}.Ceci est documenté dans la partie "Applications" chapitre le bureau du procureur des Principes de Conception.

Cependant, votre start la fonction appelle immédiatement spawn, et utilise le résultat de cette.Depuis spawn retourne Pid, plutôt que de {ok, Pid}, application:start se plaint d'un décalage entre le résultat attendu.

C'est pourquoi vous voyez bad_return:

{error,{bad_return,{{basilisk_server,start,[normal,[]]},
                  <0.38.0>}}}

C'est vous dire que vous avez un error, de type bad_return.Il s'est passé lors de l'appel basilisk_server:start(normal, []), et il a obtenu une valeur de retour de <0.38.0> (pid).

Oh, et l'autre erreur est parce que vous avez utilisé start_link, ce qui signifie que vos deux processus sont liés.Lorsque l'on meurt, les autres seront tués.C'est ce que vous avez vu avec la terminated.Dans ce cas, il est arrivé à être tué dans le milieu de io:format;il pourrait rendre plus avant d'être tué dans d'autres pistes.

En outre, une application est supposé démarrer une racine superviseur (c'est ce que le retour pid est pour).

À ce stade, vous n'avez pas besoin de l' application comportement.En fait, je ne suis pas convaincu que vous avez besoin de votre code.Appelez simplement thrift_socket_server:start et être fait avec elle.Il va continuer à s'exécuter en arrière-plan.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top