I’m still struggling a bit. I’m probably doing something basic wrong but I’m confused.
Here’s my EventServer
:
defmodule EventServer do
@moduledoc """
"""
#
# client
#
@spec broadcast(struct) :: :ok | { :error, term }
def broadcast(event) do
Phoenix.PubSub.broadcast(EventServer.PubSub, to_string(event.__struct__), event)
end
@spec subscribe(module, atom | binary) :: :ok | { :error, term }
def subscribe(subscriber, topic) do
GenServer.start_link(__MODULE__, { subscriber, to_string(topic), :handle_event })
:ok
end
@spec unsubscribe(atom | binary) :: :ok | { :error, term }
def unsubscribe(topic) do
Phoenix.PubSub.unsubscribe(EventServer.PubSub, to_string(topic))
end
#
# callbacks
#
def init({ subscriber, topic, fun }) do
Phoenix.PubSub.subscribe(EventServer.PubSub, topic, link: true)
{ :ok, { subscriber, fun } }
end
def handle_info(msg, { subscriber, fun } = state) do
apply(subscriber, fun, [ msg ])
{ :noreply, state }
end
end
My supervisor:
defmodule EventServer.Supervisor do
@moduledoc false
use Supervisor
#
# client
#
def start_link() do
Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
end
#
# callbacks
#
def init(:ok) do
Supervisor.init(children(), strategy: :one_for_one)
end
#
# private
#
defp children() do
[
supervisor(Phoenix.PubSub.PG2, [ EventServer.PubSub, [] ])
]
end
end
Here’s the code I’m using to manually test things:
defmodule Event do
defstruct [ :some_attr ]
end
defmodule Listener do
use GenServer
def start_link(_args) do
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
end
def init(:ok) do
IO.inspect "HERE"
{ :ok, nil }
end
def handle_event(%Event{} = _event) do
IO.inspect "HELLOOOOO"
end
end
defmodule SupSup do
def start_link() do
Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
end
def init(:ok) do
Supervisor.init(children(), strategy: :one_for_one)
end
defp children() do
[
{ Listener, [] }
]
end
end
SupSup.start_link()
EventServer.subscribe(Listener, Event)
EventServer.broadcast(%Event{})
Supervisor.stop(EventServer.Supervisor)
:timer.sleep(500)
EventServer.Supervisor.start_link()
EventServer.broadcast(%Event{})
When I stop EventServer.Supervisor
I would expect my Listener
GenServer to also stop when using link: true
but it doesn’t.