Packages

Simple and reliable background job processing library for Elixir. Has persistence, retries, delayed jobs, concurrency limiting, error handling and is heroku friendly.

Current section

Files

Jump to
toniq lib toniq job.ex
Raw

lib/toniq/job.ex

defmodule Toniq.Job do
# NOTE: If the format changes: add migration code for older formats
@job_format_version 1
def build(id, worker_module, arguments, options \\ []) do
%{id: id, worker: worker_module, arguments: arguments, version: @job_format_version}
|> add_delay(options)
end
def migrate(job), do: migrate_v0_jobs_to_v1(job)
# Convert from the pre-1.0 format. Replace this with the migration from 1 to 2 when you add job_format_version 2. We keep it to be able to test format migration.
defp migrate_v0_jobs_to_v1(map) do
if Map.has_key?(map, :version) do
{:unchanged, map}
else
v1 = %{
id: map.id,
worker: map.worker,
arguments: map.opts,
version: @job_format_version
}
|> add_error_if_present_in_source_data(map)
{:changed, map, v1}
end
end
defp add_error_if_present_in_source_data(v1, map) do
if Map.get(map, :error) do
Map.put(v1, :error, map.error)
else
v1
end
end
defp add_delay(job, options) do
options
|> Keyword.get(:delay_for)
|> case do
nil -> job
delay -> job |> Map.put(:delayed_until, delay |> to_expiry)
end
end
defp to_expiry(:infinity), do: :infinity
defp to_expiry(delay), do: :os.system_time(:milli_seconds) + delay
end