Pregunta

Estoy creando una aplicación erlang simple y muy nueva en el entorno, por lo que tengo problemas para entender algunos errores que recibo.No estoy seguro de cuál es la raíz de mi problema aquí, así que si hay algo relevante que no publico, hágamelo saber:

Fuente del módulo que estoy ejecutando:

  -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). y reciba estos mensajes en este orden:

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

El principal problema que tengo es identificar la fuente real del error.Tenía la impresión de que io:format Fue el problema por un corto tiempo, pero creo que fue una "pista falsa" y que bad_result es la raíz de mi problema.Ejecuté el programa en un estado casi idéntico y estaba funcionando, y de repente comencé a recibir este error.Revertí la mayoría de los cambios y no se ha detenido.También intenté reiniciar, en caso de que fuera un problema con un proceso en segundo plano.

¿Fue útil?

Solución

estas usando application:start, que espera que su módulo cumpla con las application comportamiento.

Eso es:llamará foo:start/2, para indicarle que su aplicación se está iniciando.Se espera que regreses {ok, Pid}.Esto está documentado en las "Aplicaciones". capítulo de los Principios de Diseño de la OTP.

Sin embargo, tu start la función llama inmediatamente spawn, y usa el resultado de eso.Desde spawn devoluciones Pid, en vez de {ok, Pid}, application:start se queja de un desajuste en el resultado esperado.

Por eso estás viendo bad_return:

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

Esto te está diciendo que tienes un error, de tipo bad_return.sucedió al llamar basilisk_server:start(normal, []), y obtuvo un valor de retorno de <0.38.0> (un pid).

Ah, y el otro error es porque usaste start_link, lo que significa que sus dos procesos están vinculados.Cuando uno muere, el otro será asesinado.Esto es lo que estás viendo con el terminated.En este caso, resultó que fue asesinado en medio de io:format;podría llegar más lejos antes de morir en otras carreras.

Además, se supone que una aplicación inicia un supervisor raíz (para esto es el pid devuelto).

En este punto, no necesitas el application comportamiento.De hecho, no estoy convencido de que necesite la mayor parte de su código.Solo llama thrift_socket_server:start y terminar con esto.Continuará ejecutándose en segundo plano.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top