Packages
oban
2.3.2
2.23.0
2.22.1
2.22.0
2.21.1
2.21.0
2.20.3
2.20.2
2.20.1
2.20.0
2.19.4
2.19.3
2.19.2
2.19.1
2.19.0
2.18.3
2.18.2
2.18.1
2.18.0
2.17.12
2.17.11
2.17.10
2.17.9
2.17.8
2.17.7
2.17.6
2.17.5
2.17.4
2.17.3
2.17.2
2.17.1
2.17.0
2.16.3
2.16.2
2.16.1
2.16.0
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.2
2.14.1
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.12.1
2.12.0
2.11.3
2.11.2
2.11.1
2.11.0
2.10.1
2.10.0
retired
2.9.2
2.9.1
2.9.0
2.8.0
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.0
2.0.0
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.2.0
1.1.0
1.0.0
1.0.0-rc.2
1.0.0-rc.1
0.12.1
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Robust job processing, backed by modern PostgreSQL, SQLite3, and MySQL.
Current section
Files
Jump to
Current section
Files
lib/oban/queue/supervisor.ex
defmodule Oban.Queue.Supervisor do
@moduledoc false
use Supervisor
alias Oban.{Config, Registry}
alias Oban.Queue.{Producer, Watchman}
@type option ::
{:name, module()}
| {:conf, Config.t()}
| {:queue, binary()}
| {:limit, pos_integer()}
@type queue_name :: atom() | binary()
@type queue_opts :: integer() | Keyword.t()
@spec start_link([option]) :: Supervisor.on_start()
def start_link(opts) when is_list(opts) do
name = Keyword.get(opts, :name, __MODULE__)
Supervisor.start_link(__MODULE__, opts, name: name)
end
@spec child_spec({queue_name(), queue_opts()}, Config.t()) :: Supervisor.child_spec()
def child_spec({queue, opts}, conf) do
queue = to_string(queue)
name = Registry.via(conf.name, {:supervisor, queue})
opts = Keyword.merge(opts, conf: conf, queue: queue, name: name)
Supervisor.child_spec({__MODULE__, opts}, id: queue)
end
@impl Supervisor
def init(opts) do
conf = Keyword.fetch!(opts, :conf)
queue = Keyword.fetch!(opts, :queue)
fore_name = Registry.via(conf.name, {:foreman, queue})
prod_name = Registry.via(conf.name, {:producer, queue})
watch_name = Registry.via(conf.name, {:watchman, queue})
fore_opts = [name: fore_name]
prod_opts =
opts
|> Keyword.drop([:name])
|> Keyword.merge(foreman: fore_name, name: prod_name)
|> Keyword.put_new(:dispatch_cooldown, conf.dispatch_cooldown)
|> Keyword.put_new(:poll_interval, conf.poll_interval)
watch_opts = [
foreman: fore_name,
name: watch_name,
producer: prod_name,
shutdown: conf.shutdown_grace_period
]
prod_mod = Keyword.get(opts, :producer, Producer)
children = [
{Task.Supervisor, fore_opts},
{prod_mod, prod_opts},
{Watchman, watch_opts}
]
Supervisor.init(children, strategy: :rest_for_one)
end
end