Ho un progetto di mixaggio con il più semplice possibile Supervisore e GenServer. Quando chiamo da iex:Come eseguire Elixir Supervisor in script
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
L': chiamata Mumble solleva un'eccezione, quindi la GenServer viene riavviato e la seconda: echo chiamata funziona bene.
Se eseguo il codice in qualsiasi altro modo, Supervisor non riesce a riavviare il GenServer. Per esempio, io creo un EScript del progetto con il modulo principale come segue:
defmodule EchoCmd.Echo do
def main(args) do
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
end
end
L': chiamata Mumble solleva un'eccezione e l'Escript termina senza il Supervisore riavviare il GenServer.
Non ho incluso il codice dei moduli Supervisor e Server perché funzionano correttamente quando vengono chiamati da iex, quindi suppongo che non siano necessari qui.
Ho un equivoco concettuale? Non è possibile o sto facendo qualcosa di sbagliato?
Ok, dopo tanto borbottamento e rasatura yak, questo era il mio problema, insieme a insufficiente: timer.sleeps. Potrei fare con una modalità noobie che li aggiunge dopo tutto. La mia copia si blocca da: mumble se uso GenServer.start, ma se utilizzo GenServer.start_link segnala l'errore e prosegue con un GenServer riavviato. Ho capito che dovrebbe funzionare al contrario, ma leggerò. Grazie. –