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.ex
Raw

lib/toniq.ex

defmodule Toniq do
use Application
@doc """
Enqueue for use in pipelines
Example:
params
|> extract_data
|> Toniq.enqueue_to(SendEmailWorker)
"""
def enqueue_to(arguments, worker_module, options \\ []) do
options
|> Keyword.get(:delay_for)
|> case do
nil -> enqueue(worker_module, arguments)
_ -> enqueue_with_delay(worker_module, arguments, options)
end
end
@doc """
Enqueue job to be run in the background as soon as possible
"""
def enqueue(worker_module, arguments \\ []) do
Toniq.JobPersistence.store_job(worker_module, arguments)
|> Toniq.JobRunner.register_job
end
@doc """
Enqueue job to be run in the background at a later time
"""
def enqueue_with_delay(worker_module, arguments, options) do
worker_module
|> Toniq.JobPersistence.store_delayed_job(arguments, options)
|> Toniq.DelayedJobTracker.register_job
end
@doc """
List failed jobs
"""
def failed_jobs do
Toniq.KeepalivePersistence.registered_vms
|> Enum.flat_map(&Toniq.JobPersistence.failed_jobs/1)
end
@doc """
Retry a failed job
"""
def retry(job), do: Toniq.JobPersistence.move_failed_job_to_incomming_jobs(job)
@doc """
Delete a failed job
"""
def delete(job), do: Toniq.JobPersistence.delete_failed_job(job)
@doc """
Flush all delayed jobs
"""
def flush_delayed_jobs, do: Toniq.DelayedJobTracker.flush_all_jobs
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
Toniq.Config.init
children = [
worker(Toniq.RedisConnection, []),
worker(Toniq.JobRunner, []),
worker(Toniq.JobEvent, []),
worker(Toniq.JobConcurrencyLimiter, []),
worker(Toniq.Keepalive, []),
worker(Toniq.Takeover, []),
worker(Toniq.JobImporter, []),
worker(Toniq.DelayedJobTracker, [])
]
# When one process fails we restart all of them to ensure a valid state. Jobs are then
# re-loaded from redis. Supervisor docs: http://elixir-lang.org/docs/stable/elixir/Supervisor.html
opts = [
strategy: :one_for_all,
name: Toniq.Supervisor,
max_seconds: 15,
max_restarts: 3
]
Supervisor.start_link(children, opts)
end
end