2015-07-05 12 views
5

Attualmente sto cercando di creare un atomo per una connessione di database a Redis. Di solito userei l'opzione name in start di GenServer, ma non è disponibile. Nella Guida introduttiva (Elixir 1.0.5), l'esempio sembra mostrare Process.register(pid, :kv) come opzione. Forse c'è un'opzione migliore per rendere questo processo accessibile?Process.register Non si applica ad Atom

Di seguito viene mostrato come non corrisponde la guardia nella query per il client di connessione.

iex(2)> redis_client = Exredis.start 
#PID<0.367.0> 
iex(3)> Process.register(redis_client, :redis_client) 
true 
iex(4)> :redis_client |> Exredis.query ["GET", "test"] 
** (FunctionClauseError) no function clause matching in Exredis.query/2 
    (exredis) lib/exredis.ex:95: Exredis.query(:redis_client, ["GET", "test"]) 
iex(4)> redis_client |> Exredis.query ["GET", "test"] 
:undefined 
iex(5)> redis_client |> Exredis.query ["SET", "test", "value"] 
"OK" 
iex(6)> redis_client |> Exredis.query ["GET", "test"]   
"value" 
iex(7)> :redis_client 
:redis_client 

risposta

6

tuo errore più probabile proviene da these lines in fonte ExRedis':

def query(client, command) when is_pid(client) and is_list(command), do: 
    client |> :eredis.q(command) |> elem(1) 

Come si può vedere, start_link/2 accetta solo un PID come primo argomento (when is_pid(client)).

È possibile utilizzare Process.whereis/1 per trovare il PID di un processo registrato e passare che a ExRedis:

iex> :redis_client |> Process.whereis |> Exredis.query(["SET", "test", "value"]) 
"OK" 
+0

Grazie whatyouhide =). Ho pensato che quando è stato registrato, sarebbe process_id/process, e non un nome del processo. – rockerBOO

+0

Qualcuno dovrebbe probabilmente aprire un problema su ExRedis, non dovrebbero limitarlo davvero ai pid. –

Problemi correlati