Domanda

Sto costruendo una semplice applicazione Erlang e molto nuovo per l'ambiente, quindi ho problemi a dare un senso ad alcuni errori che sto ottenendo.Non sono sicuro di cosa sia la radice del mio problema, quindi se c'è qualcosa di rilevante che non postassi, per favore fammi sapere:

Source for Module I in esecuzione:

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

Corro application:start(basilisk_server). e ricevi questi messaggi in questo ordine:

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

Il problema principale Sto avendo identificato la fonte effettiva dell'errore.Ero sotto l'impressione che io:format fosse il problema per un po 'di tempo, ma credo che sia stata una "aringhe rosse" e che Bad_result è la radice del mio problema.Ho eseguito il programma in uno stato quasi identico e lavoravo e improvvisamente ha iniziato a ottenere questo errore.Ho rotolato la maggior parte dei cambiamenti e non ho fermato.Ho anche provato il riavvio, nel caso in cui fosse un problema con un processo di sfondo.

È stato utile?

Soluzione

Stai utilizzando application:start, che si aspetta che il tuo modulo aderisca il comportamento application.

cioè: chiamerà foo:start/2, per dirti che la tua applicazione sta iniziando. Ti prevedi di restituire {ok, Pid}. Questo è documentato nelle "applicazioni" Capitolo dei principi di design OTP.

Tuttavia, la funzione start chiama immediatamente spawn e utilizza il risultato di ciò. Poiché spawn restituisce Pid, piuttosto che {ok, Pid}, application:start si lamenta di una mancata corrispondenza nel risultato atteso.

Ecco perché stai vedendo bad_return:

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

Questo ti sta dicendo che hai ottenuto un error, di tipo bad_return. È successo quando si chiama basilisk_server:start(normal, []) e ha ottenuto un valore di ritorno del <0.38.0> (un PID).

Oh, e l'altro errore è perché hai utilizzato start_link, il che significa che i tuoi due processi sono collegati. Quando uno muore, l'altro sarà ucciso. Questo è ciò che stai vedendo con il terminated. In questo caso, è successo ad essere ucciso nel mezzo del io:format; Potrebbe renderlo ulteriormente prima di essere ucciso in altre corse.

Inoltre, viene assunta un'applicazione per avviare un supervisore root (questo è ciò che il PID restituito è per).

A questo punto, non è necessario il comportamento application. In effetti, non sono convinto di aver bisogno di gran parte del tuo codice. Basta chiamare thrift_socket_server:start e essere fatto con esso. Continuerà a correre in background.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top