Hi all ;),
I followed the guide on Elixir’s getting started coupled with the GenServer in hexdocs and another tutorial to create a simple cache GenServer.
Something, probably simple, evade me and it seems the server is not started, yet it is in the child array for supervision in the application.ex
.
Here’s the code for the GenServer:
defmodule Tangara.Cache do
use GenServer
def start_link(_opts) do
IO.puts("start_link called")
GenServer.start_link(Tangara.Cache, [])
end
def get_countries do
get("countries")
end
def get(key) do
case GenServer.call(Tangara.Cache, {:get, key}) do
nil -> []
x -> x
end
end
@impl true
def init(_opts) do
IO.puts("init called")
{:ok, json} = File.read("priv/countries.json")
countries = Jason.decode!(json)
{:ok, %{"countries" => countries}}
end
@impl true
def handle_call({:get, key}, _from, map) do
{:reply, Map.get(map, key), map}
end
end
I’ve added IO.puts
as desperation. Here’s the application.ex
entry:
children = [
{Tangara.Cache, []},
# Start the Ecto repository
Tangara.Repo,
# Start the Telemetry supervisor
TangaraWeb.Telemetry,
# Start the PubSub system
{Phoenix.PubSub, name: Tangara.PubSub},
# Start the Endpoint (http/https)
TangaraWeb.Endpoint
# Start a worker by calling: Tangara.Worker.start_link(arg)
# {Tangara.Worker, arg}
]
I’ve tried all sorts of things here, without the {},calling start_link
directly there.
The app start: iex -S mix phx.server
I see my IO.puts, yet if I do
iex> Tangara.Cache.get("test")
I’m getting this:
** (exit) exited in: GenServer.call(Tangara.Cache, {:get, "test"}, 5000)
** (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
(elixir 1.12.3) lib/gen_server.ex:1014: GenServer.call/3
(tangara 0.1.0) lib/tangara/cache.ex:14: Tangara.Cache.get/1
Hopefully someone can points me to what I missed, the concept of GenServer / supervisor are all clear, yet I find myself in a situation where I’m stuck.
Thanks for your time,
Dominic