Minion::Backend(3)
π Minion::Backend(3) β Backend base class π
bestie, welcome to the Minion::Backend(3) manual from the User Contributed Perl Documentation. This is part 1 of 2, and we are keeping every single fact, flag, field, default, and code line exactly where it belongs β just with more sparkle. β¨
πΈ NAME πΈ
Minion::Backend β Backend base class. It's the blueprint, the mother of all Minion backends. no cap.
π¦ SYNOPSIS π¦
So you wanna make your own backend? The vibe is:
package Minion::Backend::MyBackend;
use Mojo::Base 'Minion::Backend';
sub broadcast {...}
sub dequeue {...}
sub enqueue {...}
sub fail_job {...}
sub finish_job {...}
sub history {...}
sub list_jobs {...}
sub list_locks {...}
sub list_workers {...}
sub lock {...}
sub note {...}
sub receive {...}
sub register_worker {...}
sub remove_job {...}
sub repair {...}
sub reset {...}
sub retry_job {...}
sub stats {...}
sub unlock {...}
sub unregister_worker {...}
π DESCRIPTION π
Minion::Backend is an abstract base class for Minion backends, like Minion::Backend::Pg. It's the base class, so you build on it.
β¨ ATTRIBUTES β¨
Minion::Backend implements the following attributes.
minion
my $minion = $backend->minion;
$backend = $backend->minion(Minion->new);
Minion object this backend belongs to. Note that this attribute is weakened.
π METHODS π
Minion::Backend inherits all methods from Mojo::Base and implements the following new ones. slay.
auto_retry_job
my $bool = $backend->auto_retry_job($job_id, $retries, $attempts);
Automatically "retry" job with backoff in Minion if there are attempts left, used to implement backends like Minion::Backend::Pg.
broadcast
my $bool = $backend->broadcast('some_command');
my $bool = $backend->broadcast('some_command', [@args]);
my $bool = $backend->broadcast('some_command', [@args], [$id1, $id2, $id3]);
Broadcast remote control command to one or more workers. Meant to be overloaded in a subclass.
dequeue
my $job_info = $backend->dequeue($worker_id, 0.5);
my $job_info = $backend->dequeue($worker_id, 0.5, {queues => ['important']});
Wait a given amount of time in seconds for a job, dequeue it and transition from "inactive" to "active" state, or return "undef" if queues were empty. Meant to be overloaded in a subclass.
These options are currently available:
idβid => '10023'β Dequeue a specific job.min_priorityβmin_priority => 3β Do not dequeue jobs with a lower priority.queuesβqueues => ['important']β One or more queues to dequeue jobs from, defaults to"default".tasksβtasks => ['foo', 'bar']β One or more tasks to dequeue jobs for, defaults to all.
These fields are currently available:
argsβargs => ['foo', 'bar']β Job arguments.idβid => '10023'β Job ID.retriesβretries => 3β Number of times job has been retried.taskβtask => 'foo'β Task name.
enqueue
my $job_id = $backend->enqueue('foo');
my $job_id = $backend->enqueue(foo => [@args]);
my $job_id = $backend->enqueue(foo => [@args] => {priority => 1});
Enqueue a new job with "inactive" state. Meant to be overloaded in a subclass.
These options are currently available:
attemptsβattempts => 25β Number of times performing this job will be attempted, with a delay based on"backoff"in Minion after the first attempt, defaults to 1.delayβdelay => 10β Delay job for this many seconds (from now), defaults to 0.expireβexpire => 300β Job is valid for this many seconds (from now) before it expires.laxβlax => 1β Existing jobs this job depends on may also have transitioned to the"failed"state to allow for it to be processed, defaults to"false".notesβnotes => {foo => 'bar', baz => [1, 2, 3]}β Hash reference with arbitrary metadata for this job.parentsβparents => [$id1, $id2, $id3]β One or more existing jobs this job depends on, and that need to have transitioned to the state"finished"before it can be processed.priorityβpriority => 5β Job priority, defaults to 0. Jobs with a higher priority get performed first. Priorities can be positive or negative, but should be in the range between 100 and -100.queueβqueue => 'important'β Queue to put job in, defaults to"default".
fail_job
my $bool = $backend->fail_job($job_id, $retries);
my $bool = $backend->fail_job($job_id, $retries, 'Something went wrong!');
my $bool = $backend->fail_job(
$job_id, $retries, {whatever => 'Something went wrong!'});
Transition from "active" to "failed" state with or without a result, and if there are attempts remaining, transition back to "inactive" with a delay based on "backoff" in Minion. Meant to be overloaded in a subclass.
finish_job
my $bool = $backend->finish_job($job_id, $retries);
my $bool = $backend->finish_job($job_id, $retries, 'All went well!');
my $bool = $backend->finish_job(
$job_id, $retries, {whatever => 'All went well!'});
Transition from "active" to "finished" state with or without a result. Meant to be overloaded in a subclass.
history
my $history = $backend->history;
Get history information for job queue. Meant to be overloaded in a subclass.
These fields are currently available:
dailyβdaily => [{epoch => 12345, finished_jobs => 95, failed_jobs => 2}, ...]β Hourly counts for processed jobs from the past day.
list_jobs
my $results = $backend->list_jobs($offset, $limit);
my $results = $backend->list_jobs($offset, $limit, {states => ['inactive']});
Returns the information about jobs in batches. Meant to be overloaded in a subclass.
# Get the total number of results (without limit)
my $num = $backend->list_jobs(0, 100, {queues => ['important']})->{total};
# Check job state
my $results = $backend->list_jobs(0, 1, {ids => [$job_id]});
my $state = $results->{jobs}[0]{state};
# Get job result
my $results = $backend->list_jobs(0, 1, {ids => [$job_id]});
my $result = $results->{jobs}[0]{result};
These options are currently available:
beforeβbefore => 23β List only jobs before this id.idsβids => ['23', '24']β List only jobs with these ids.notesβnotes => ['foo', 'bar']β List only jobs with one of these notes.queuesβqueues => ['important', 'unimportant']β List only jobs in these queues.statesβstates => ['inactive', 'active']β List only jobs in these states.tasksβtasks => ['foo', 'bar']β List only jobs for these tasks.
These fields are currently available:
argsβargs => ['foo', 'bar']β Job arguments.attemptsβattempts => 25β Number of times performing this job will be attempted.childrenβchildren => ['10026', '10027', '10028']β Jobs depending on this job.createdβcreated => 784111777β Epoch time job was created.delayedβdelayed => 784111777β Epoch time job was delayed to.expiresβexpires => 784111777β Epoch time job is valid until before it expires.finishedβfinished => 784111777β Epoch time job was finished.idβid => 10025β Job id.laxβlax => 0β Existing jobs this job depends on may also have failed to allow for it to be processed.notesβnotes => {foo => 'bar', baz => [1, 2, 3]}β Hash reference with arbitrary metadata for this job.parentsβparents => ['10023', '10024', '10025']β Jobs this job depends on.priorityβpriority => 3β Job priority.queueβqueue => 'important'β Queue name.resultβresult => 'All went well!'β Job result.retriedβretried => 784111777β Epoch time job has been retried.retriesβretries => 3β Number of times job has been retried.startedβstarted => 784111777β Epoch time job was started.stateβstate => 'inactive'β Current job state, usually"active","failed","finished"or"inactive".taskβtask => 'foo'β Task name.timeβtime => 78411177β Server time.workerβworker => '154'β Id of worker that is processing the job.
list_locks
my $results = $backend->list_locks($offset, $limit);
my $results = $backend->list_locks($offset, $limit, {names => ['foo']});
Returns information about locks in batches. Meant to be overloaded in a subclass.
# Get the total number of results (without limit)
my $num = $backend->list_locks(0, 100, {names => ['bar']})->{total};
# Check expiration time
my $results = $backend->list_locks(0, 1, {names => ['foo']});
my $expires = $results->{locks}[0]{expires};
These options are currently available:
namesβnames => ['foo', 'bar']β List only locks with these names.
These fields are currently available:
expiresβexpires => 784111777β Epoch time this lock will expire.idβid => 1β Lock id.nameβname => 'foo'β Lock name.
list_workers
my $results = $backend->list_workers($offset, $limit);
my $results = $backend->list_workers($offset, $limit, {ids => [23]});
Returns information about workers in batches. Meant to be overloaded in a subclass.
# Get the total number of results (without limit)
my $num = $backend->list_workers(0, 100)->{total};
# Check worker host
my $results = $backend->list_workers(0, 1, {ids => [$worker_id]});
my $host = $results->{workers}[0]{host};
These options are currently available:
beforeβbefore => 23β List only workers before this id.idsβids => ['23', '24']β List only workers with these ids.
These fields are currently available:
idβid => 22β Worker id.hostβhost => 'localhost'β Worker host.jobsβjobs => ['10023', '10024', '10025', '10029']β Ids of jobs the worker is currently processing.notifiedβnotified => 784111777β Epoch time worker sent the last heartbeat.pidβpid => 12345β Process id of worker.startedβstarted => 784111777β Epoch time worker was started.statusβstatus => {queues => ['default', 'important']}β Hash reference with whatever status information the worker would like to share.
lock
my $bool = $backend->lock('foo', 3600);
my $bool = $backend->lock('foo', 3600, {limit => 20});
So like, you're trying to snag a named lock that will auto-expire after the number of seconds you give it. An expiration time of 0 can be used to check if a named lock already exists without creating one. This is meant to be overloaded in a subclass, bestie. No cap. π
These options are currently available:
limitβlimit => 20β number of shared locks with the same name that can be active at the same time, defaults to1. Lowkey important.
note π
my $bool = $backend->note($job_id, {mojo => 'rocks', minion => 'too'});
So you can change one or more metadata fields for a job. If you set a value to undef, it literally removes the field. Meant to be overloaded in a subclass. Periodt. π
receive π¬
my $commands = $backend->receive($worker_id);
This is how you receive remote control commands for a worker. Meant to be overloaded in a subclass. Iykyk.
register_worker π«Ά
my $worker_id = $backend->register_worker;
my $worker_id = $backend->register_worker($worker_id);
my $worker_id = $backend->register_worker(
$worker_id, {status => {queues => ['default', 'important']}});
Register worker or send heartbeat to show that this worker is still alive. Meant to be overloaded in a subclass. The way that this keeps your worker from being ghosted? Iconic.
These options are currently available:
statusβstatus => {queues => ['default', 'important']}β hash reference with whatever status information the worker would like to share. Fr fr.
remove_job ποΈ
my $bool = $backend->remove_job($job_id);
Remove failed, finished or inactive job from queue. Meant to be overloaded in a subclass. Lowkey essential.
repair π οΈ
$backend->repair;
Repair worker registry and job queue if necessary. Meant to be overloaded in a subclass. It's giving maintenance era.
reset π
$backend->reset({all => 1});
Reset job queue. Meant to be overloaded in a subclass. Not me hitting the reset button like it's a vibe reset.
These options are currently available:
allβall => 1β reset everything. Slay.locksβlocks => 1β reset only locks. Periodt.
retry_job π
my $bool = $backend->retry_job($job_id, $retries);
my $bool = $backend->retry_job($job_id, $retries, {delay => 10});
Transition job back to inactive state, already inactive jobs may also be retried to change options. Meant to be overloaded in a subclass. Fr fr.
These options are currently available:
attemptsβattempts => 25β number of times performing this job will be attempted.delayβdelay => 10β delay job for this many seconds (from now), defaults to0.expireβexpire => 300β job is valid for this many seconds (from now) before it expires.laxβlax => 1β existing jobs this job depends on may also have transitioned to thefailedstate to allow for it to be processed, defaults tofalse.parentsβparents => [$id1, $id2, $id3]β jobs this job depends on.priorityβpriority => 5β job priority.queueβqueue => 'important'β queue to put job in.
stats π
my $stats = $backend->stats;
Get statistics for the job queue. Meant to be overloaded in a subclass. Obsessed with data.
These fields are currently available:
active_jobsβactive_jobs => 100β number of jobs inactivestate.active_locksβactive_locks => 100β number of active named locks.active_workersβactive_workers => 100β number of workers that are currently processing a job.delayed_jobsβdelayed_jobs => 100β number of jobs ininactivestate that are scheduled to run at specific time in the future or have unresolved dependencies.enqueued_jobsβenqueued_jobs => 100000β rough estimate of how many jobs have ever been enqueued.failed_jobsβfailed_jobs => 100β number of jobs infailedstate.finished_jobsβfinished_jobs => 100β number of jobs infinishedstate.inactive_jobsβinactive_jobs => 100β number of jobs ininactivestate.inactive_workersβinactive_workers => 100β number of workers that are currently not processing a job.uptimeβuptime => 1000β uptime in seconds.workersβworkers => 200;β number of registered workers.
unlock π
my $bool = $backend->unlock('foo');
Release a named lock. Meant to be overloaded in a subclass. Bye lock.
unregister_worker π
$backend->unregister_worker($worker_id);
Unregister worker. Meant to be overloaded in a subclass. Adios.
SEE ALSO π
MinionMinion::Guide<https://minion.pm>Mojolicious::Guides<https://mojolicious.org>
That's the whole vibe, bestie. This page is from perl v5.42.0, dated 2026-01-17, and it's the Minion::Backend(3) manual. Slay. π β¨
π¦ where this page comes from
- fedora 44: perl-Minion 11.0-2.fc44 Β· Artistic-2.0 AND CC-BY-SA-4.0 AND MIT AND ISC
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms