Dies sind meine ersten 2 Stunden Elixir, also könnte es eine noobish Frage sein, aber ich habe einige Probleme mit einem GenServer
laichen und es werfen. Ich benutze dieses Modul, das nach Änderungen in einer Datei in meinem System sucht, und jedes Mal, wenn ein neuer Eintrag in dieser Datei hinzugefügt wird, möchte ich das Protokoll auf einen Gen-Server umwandeln, der es analysiert und tut, was es tun soll auf seine Ergebnisse.Elixir GenServer cast und start_link
Hier ist das Modul, das die Änderungen Uhren:
defmodule Test.Watcher do
use ExFSWatch, dirs: ["/var/log/"]
import Test.Receiver, only: [analyze_log: 2]
def callback(file_path, actions) do
if file_path == "/var/log/syslog" do
if :modified in actions do
#~~~~ WHERE DO I GET THIS pid FROM?
analyze_log pid, get_log
end
end
end
def get_log do
{log, _} = System.cmd("tail", ["-n", "1", "/var/log/syslog"])
log
end
end
Der Beobachter sehr gut funktioniert und es erhält die neuen Protokolle, aber ich habe ein Problem mit Test.Receiver
, die GenServer
verwendet.
Meine erste Frage ist ... wo starte ich diesen Gen-Server? ExFSWatch
hat seine eigene start
Methode und ich kann das nicht überschreiben. Rufe ich jedes Mal, wenn ein neues Protokoll eingeht, start_link
an (ich bezweifle das, aber ich musste fragen)?
Ny alle Beispiele, die ich lesen soll ich es woanders beginnen, packen es pid
und als param auf die analyze_log
-Methode übergeben, so, wenn ich Recht habe, meine einzige verbleibende Problem ist eine gute herauszufinden, Ort, um die Test.Receiver
Genserver zu starten und greifen es ist pid, so dass ich es innerhalb der callback
Methode verwenden kann.
defmodule Test.Receiver do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, :ok, [])
end
def analyze_log(pid, log) do
GenServer.cast(pid, {:analyze_log, log})
end
def init(:ok) do
{:ok, %{}}
end
def handle_cast({:analyze_log, log}, state) do
IO.puts log
{:noreply, state}
end
end
Die meisten Module, die solche Callback-Schnittstelle haben, haben auch ein zusätzliches "state" -Argument, um solche Informationen herumzutragen, aber es sieht so aus, als hätte 'ExFSWatch' keins. Der einfachste Weg, an den ich denken kann, besteht darin, den Empfängerprozess mit einem Namen zu spawnen und zu registrieren und ihn namentlich zu nennen. – Dogbert
Ich habe eine Antwort basierend auf Ihrem Kommentar gebildet, da es geholfen hat. Vielen Dank. –