defmodule NSQ.Consumer.Supervisor do
use Supervisor
def start_link(topic, channel, config, opts \\ []) do
Supervisor.start_link(__MODULE__, {topic, channel, config}, opts)
end
@impl true
def init({topic, channel, config}) do
consumer_name = String.to_atom("nsq_consumer_#{UUID.uuid4(:hex)}")
discovery_loop_id = String.to_atom("#{consumer_name}_discovery_loop")
rdy_loop_id = String.to_atom("#{consumer_name}_rdy_loop")
children = [
{NSQ.Consumer, {topic, channel, config, [name: consumer_name]}},
# Tasks have temporary restart policy by default
Supervisor.child_spec(
{Task, fn -> NSQ.Consumer.Connections.discovery_loop(consumer_name) end},
id: discovery_loop_id,
restart: :permanent
),
Supervisor.child_spec(
{Task, fn -> NSQ.Consumer.RDY.redistribute_loop(consumer_name) end},
id: rdy_loop_id,
restart: :permanent
)
]
Supervisor.init(children, strategy: :rest_for_one)
end
end