Packages
quantum
2.2.0
3.5.3
3.5.2
retired
3.5.1
retired
3.5.0
3.4.0
3.3.0
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
retired
2.3.0
retired
2.2.7
2.2.6
2.2.5
retired
2.2.4
retired
2.2.3
retired
2.2.2
retired
2.2.1
retired
2.2.0
retired
2.1.3
retired
2.1.2
retired
2.1.1
retired
2.1.0
retired
2.1.0-beta.1
retired
2.0.4
retired
2.0.3
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
2.0.0-beta.2
retired
2.0.0-beta.1
retired
1.9.3
retired
1.9.2
retired
1.9.1
retired
1.9.0
retired
1.8.1
retired
1.8.0
retired
1.7.1
retired
1.7.0
retired
1.6.1
retired
1.6.0
retired
1.5.0
retired
1.4.0
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.4
retired
1.2.3
retired
1.2.2
retired
1.2.1
retired
1.2.0
retired
1.1.0
retired
1.0.4
retired
1.0.3
retired
1.0.2
retired
1.0.1
retired
1.0.0
retired
Cron-like job scheduler for Elixir.
Retired package: task supervisor could fail in cluster
Current section
Files
Jump to
Current section
Files
lib/quantum/run_strategy/random.ex
defmodule Quantum.RunStrategy.Random do
@moduledoc """
Run job on one node of the list randomly.
If the node list is `:cluster`, one node of the cluster will be used.
This run strategy also makes sure, that the node doesn't run in two places at the same time
if `job.overlap` is falsy.
### Mix Configuration
config :my_app, MyApp.Scheduler,
jobs: [
# Run on any node in cluster
[schedule: "* * * * *", run_strategy: {Quantum.RunStrategy.Random, :cluster}],
# Run on any node of given list
[schedule: "* * * * *", run_strategy: {Quantum.RunStrategy.Random, [:"node@host1", :"node@host2"]}],
]
"""
@type t :: %__MODULE__{nodes: [Node.t()] | :cluster}
defstruct nodes: nil
@behaviour Quantum.RunStrategy
alias Quantum.Job
@spec normalize_config!([Node.t()] | :cluster) :: t
def normalize_config!(nodes) when is_list(nodes) do
%__MODULE__{nodes: Enum.map(nodes, &normalize_node/1)}
end
def normalize_config!(:cluster), do: %__MODULE__{nodes: :cluster}
@spec normalize_node(Node.t() | binary) :: Node.t()
defp normalize_node(node) when is_atom(node), do: node
defp normalize_node(node) when is_binary(node), do: String.to_atom(node)
defimpl Quantum.RunStrategy.NodeList do
@spec nodes(Quantum.RunStrategy.Random.t(), Job.t()) :: [Node.t()]
def nodes(%Quantum.RunStrategy.Random{nodes: :cluster}, _job) do
[Enum.random([node() | Node.list()])]
end
def nodes(%Quantum.RunStrategy.Random{nodes: nodes}, _job) do
[Enum.random(nodes)]
end
end
end