Packages
tarearbol
1.1.1
1.12.0
1.11.2
1.11.1
1.11.0
1.10.4
1.10.3
1.10.2
1.10.0
1.9.102
1.9.101
1.9.100
1.9.99
1.9.11
1.9.10
1.9.9
1.9.8
1.9.7
1.9.6
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.2
1.8.1
1.8.0
1.7.0
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.0
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.0
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.4
1.0.3
1.0.2
1.0.0
0.99.11
0.99.10
0.99.9
0.99.8
0.99.7
0.99.6
0.99.4
0.99.3
0.99.2
0.99.1
0.99.0
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.0
0.9.6
0.9.5
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.0
The supervised tree of tasks, simplifying the process of handling: - recurrent tasks - retried tasks - long tasks - etc
Current section
Files
Jump to
Current section
Files
lib/tarearbol/application.ex
defmodule Tarearbol.Application do
@moduledoc false
use Boundary, deps: [Tarearbol.Scheduler]
use Application
@spec start(Application.app(), Application.restart_type()) ::
{:error, any()} | {:ok, pid()} | {:ok, pid(), any()}
def start(_type, _args) do
optional =
if Application.get_env(:tarearbol, :scheduler, false), do: [Tarearbol.Scheduler], else: []
children = [
{Task.Supervisor, [name: Tarearbol.Application]} | optional
]
opts = [strategy: :one_for_one, name: Tarearbol.Supervisor]
Supervisor.start_link(children, opts)
end
##############################################################################
@spec children :: [{:local | :external, Process.dest(), Tarearbol.Scheduler.Job.t(), keyword()}]
def children, do: children(:local) ++ children(:external)
@spec children(:local | :external) :: [
{:local | :external, Process.dest(), Tarearbol.Scheduler.Job.t(), keyword()}
]
def children(:local) do
Tarearbol.Application
|> Task.Supervisor.children()
|> Enum.map(&{:local, &1, Process.info(&1, :dictionary)})
|> Enum.map(fn {:local, pid, {:dictionary, dict}} -> {:local, pid, dict[:job]} end)
|> Enum.map(fn
{:local, pid, {job, interval, opts}} ->
{:local, pid, job, Keyword.put(opts, :timeout, interval)}
_ ->
nil
end)
|> Enum.reject(&is_nil/1)
end
def children(:external) do
for {name, %Tarearbol.DynamicManager.Child{} = child} <-
Tarearbol.Scheduler.State.state().children do
{:external, child.pid, child.opts.payload.job,
[__name__: name, timeout: child.opts.timeout]}
end
end
def jobs, do: Enum.map(children(), &elem(&1, 2))
@spec kill :: [:ok | {:error, :not_found | :dead}]
def kill, do: for(child <- children(), do: kill(child))
@spec kill(Process.dest()) :: :ok | {:error, :not_found | :dead}
def kill(child) when is_pid(child) or is_port(child) or is_atom(child) or is_tuple(child) do
child =
case child do
{_, pid, _, _} -> pid
pid -> pid
end
case Enum.find(children(), &match?({_, ^child, _, _}, &1)) do
nil -> {:error, :not_found}
{:local, victim, _, _} -> Task.Supervisor.terminate_child(Tarearbol.Application, victim)
{:external, _, _, opts} -> Tarearbol.Scheduler.del(opts[:__name__])
end
end
@spec task!((() -> any()) | {module(), atom(), list()}) :: Task.t()
def task!(job) when is_function(job, 0),
do: Task.Supervisor.async_nolink(Tarearbol.Application, job)
def task!({mod, fun, params}),
do: Task.Supervisor.async_nolink(Tarearbol.Application, mod, fun, params)
end