2017-06-12 2 views
0

Ich habe zwei Knoten auf meinem PC ([email protected] und [email protected]).
Der bar Knoten hat einen einfachen gen-Server drin:Elixir - gen gen Server von einem anderen Knoten

defmodule Bar.Server do 
    use ExActor.GenServer, export: :bar_server 
    defstart start_link, do: initial_state(0) 
    defcall get, state: state, do: reply(state) 
    defcast(set(num), state: state, do: new_state(state + num)) 
end 

Die Genserver gestartet und läuft so, wenn ich laufen:

GenServer.call(:bar_server, :get) 

es perfekt funktioniert.
verbunden I foo-bar von Node.connect :'[email protected]'
in foo läuft und was ich war zu erwarten, dass jetzt foo mit dem genserver vertraut sein wird :aa in bar,
Aber - wenn ich

GenServer.call(:bar_server, :get) 

laufen i erhalten:

(EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started 

Ich nehme an, dass ich etwas vermisse. aber kann was herausfinden.

+2

Hat diese Arbeit: 'GenServer.call ({: bar_server,: 'bar @ mein-pc'},:))? – Dogbert

+0

ja ich tue es. danke – fay

Antwort

4

Angenommen, Sie nur eine einzelne Instanz der GenServer läuft zwischen den beiden Knoten wollen, müssen Sie explizit die GenServer als globale Register:

use ExActor.GenServer, export: {:global, :bar_server} 
+0

Soll das funktionieren, wenn zwei Knoten im selben Cluster (auf kubernetes) verbunden werden. weil ich aus irgendeinem Grund den Fehler "no process ..." bekomme, wenn ich versuche, den genserver zu erreichen. ? – fay

+0

Entschuldigung, ich habe vergessen zu erwähnen, dass Sie 'GenServer.call ({: global,: bar_server},: get) aufrufen müssen' ' –

+0

Wie behandeln Sie, wenn mehrere Instanzen von Gen-Server auf einem einzelnen Rechner laufen? – shubhamagiwal92