Frage

Ich erstelle eine einfache Erlang-Anwendung und bin noch sehr neu in der Umgebung, daher fällt es mir schwer, einige Fehler zu verstehen, die ich erhalte.Ich bin mir nicht sicher, wo die Ursache meines Problems liegt. Wenn es also etwas Relevantes gibt, das ich nicht poste, lassen Sie es mich bitte wissen:

Quelle für das Modul, das ich ausführe:

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

ich renne application:start(basilisk_server). und erhalten Sie diese Nachrichten in dieser Reihenfolge:

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

Das Hauptproblem, das ich habe, besteht darin, die tatsächliche Fehlerquelle zu identifizieren.Ich hatte den Eindruck, dass io:format war für kurze Zeit das Problem, aber ich glaube, das war ein Ablenkungsmanöver und dass bad_result die Wurzel meines Problems ist.Ich habe das Programm in einem fast identischen Zustand ausgeführt und es hat funktioniert, und plötzlich bekam ich diesen Fehler.Ich habe die meisten Änderungen rückgängig gemacht und es hat nicht aufgehört.Ich habe auch einen Neustart versucht, für den Fall, dass es ein Problem mit einem Hintergrundprozess gab.

War es hilfreich?

Lösung

Du verwendest application:start, die von Ihrem Modul erwartet, dass es sich daran hält application Verhalten.

Das ist:es wird anrufen foo:start/2, um Ihnen mitzuteilen, dass Ihre Bewerbung beginnt.Es wird erwartet, dass Sie zurückkehren {ok, Pid}.Dies ist im Abschnitt „Anträge“ dokumentiert. Kapitel der OTP-Designprinzipien.

Allerdings Ihr start Funktion ruft sofort auf spawn, und verwendet das Ergebnis davon.Seit spawn kehrt zurück Pid, statt {ok, Pid}, application:start beschwert sich über eine Diskrepanz im erwarteten Ergebnis.

Deshalb sehen Sie bad_return:

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

Das sagt Ihnen, dass Sie eine haben error, vom Typ bad_return.Es passierte beim Anruf basilisk_server:start(normal, []), und es erhielt einen Rückgabewert von <0.38.0> (eine PID).

Oh, und der andere Fehler liegt daran, dass Sie verwendet haben start_link, was bedeutet, dass Ihre beiden Prozesse verknüpft sind.Wenn einer stirbt, wird der andere getötet.Das sehen Sie mit dem terminated.In diesem Fall wurde es zufällig mittendrin getötet io:format;Es könnte es weiter schaffen, bevor es in anderen Läufen getötet wird.

Darüber hinaus wird davon ausgegangen, dass eine Anwendung einen Root-Supervisor startet (dazu dient die zurückgegebene PID).

Zu diesem Zeitpunkt benötigen Sie das nicht application Verhalten.Tatsächlich bin ich nicht davon überzeugt, dass Sie den Großteil Ihres Codes überhaupt benötigen.Ruf einfach an thrift_socket_server:start und sei damit fertig.Es läuft weiterhin im Hintergrund.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top