defmodule NSQ.Connection.Supervisor do @moduledoc """ A consumer or producer will initialize this supervisor empty to start. Candidate nsqd connections will be discovered elsewhere and added with start_child. """ # ------------------------------------------------------- # # Directives # # ------------------------------------------------------- # use Supervisor alias NSQ.ConnInfo, as: ConnInfo # ------------------------------------------------------- # # Behaviour Implementation # # ------------------------------------------------------- # def start_link(opts \\ []) do Supervisor.start_link(__MODULE__, :ok, opts) end def start_child(parent, nsqd, parent_state \\ nil, opts \\ []) do parent_state = parent_state || GenServer.call(parent, :state) conn_sup_pid = parent_state.conn_sup_pid args = { parent, nsqd, parent_state.config, parent_state.topic, parent_state.channel, parent_state.conn_info_pid, parent_state.event_manager_pid } conn_id = ConnInfo.conn_id(parent, nsqd) # When using nsqlookupd, we expect connections will be naturally # rediscovered if they fail. opts = [id: conn_id, restart: :temporary] ++ opts child = Supervisor.child_spec({NSQ.Connection, args}, opts) Supervisor.start_child(conn_sup_pid, child) end def init(:ok) do Supervisor.init([], strategy: :one_for_one) end end