Rihanna v2.3.1 Rihanna.Job behaviour View Source
A behaviour for Rihanna jobs.
You must implement Rihanna.Job.perform/1
in your job, and it must return
one of the following values:
:ok
{:ok, result}
:error
{:error, reason}
You can define your job like the example below:
defmodule MyApp.MyJob do
@behaviour Rihanna.Job
# NOTE: `perform/1` is a required callback. It takes exactly one argument. To
# pass multiple arguments, wrap them in a list and destructure in the
# function head as in this example
def perform([arg1, arg2]) do
success? = do_some_work(arg1, arg2)
if success? do
# job completed successfully
:ok
else
# job execution failed
{:error, :failed}
end
end
end
This behaviour allows you to tailor what you'd like to happen after your job either fails, or raises an exception.
You can define an after_error/2
method which will run before the job is
placed on the failed job queue.
If you don't define this callback, it will add it to the failed job queue without running anything.
If you wish to re-enqueue a job to run at a different time, you can simply
return {:reenqueue, due_at}
where due_at
is some DateTime timestamp.
def after_error(failure_reason, args) do
notify_someone(__MODULE__, failure_reason, args)
end
You can define a retry_at/3
callback function. Returning {:ok, due_at}
will schedule the job to run again at that time. Returning :noop (the default)
proceeds with normal job failure behavior. The value of attempts
counts up
from 0, to allow backing off due_at
to be calculated.
def retry_at(_failure_reason, _args, attempts) when attempts < 3 do
due_at = DateTime.add(DateTime.utc_now(), attempts * 5, :second)
{:ok, due_at}
end
def retry_at(_failure_reason, _args, _attempts) do
warn("Job failed after 3 attempts")
:noop
end
You can define a priority/0
function which will be called if no priority
is set when a job is enqueued. It should return a single integer. A priority
of 1 will be the highest priority, with larger numbers being run after.
If you don't define this callback it will default to a priority of 50, in an
attempt to have it run at a lower priority.
def priority(), do: 2
Link to this section Summary
Functions
Checks whether a job implemented the after_error
callback and runs it if it
does.
Update attempts and set due_at datetime
Checks if a job implements priority
callback and runs it.
Checks when a job should be retried at
The name of the jobs table.
Link to this section Types
Link to this section Functions
Checks whether a job implemented the after_error
callback and runs it if it
does.
Update attempts and set due_at datetime
Checks if a job implements priority
callback and runs it.
A lower value means a higher job priority. Has a default of 50, a very low priority, to prevent new jobs from running before higher priority jobs, when no priority is set.
Checks when a job should be retried at
The name of the jobs table.
Link to this section Callbacks
after_error(arg1, arg)
View Source (optional)after_error({:error, reason()} | :error | Exception.t(), arg()) :: any()
retry_at(arg1, arg, pos_integer)
View Source (optional)retry_at({:error, reason()} | :error | Exception.t(), arg(), pos_integer()) :: {:ok, DateTime.t()} | :noop