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 to 1. 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 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.
  • 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 in active state.
  • 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 in inactive state 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 in failed state.
  • finished_jobs β€” finished_jobs => 100 β€” number of jobs in finished state.
  • inactive_jobs β€” inactive_jobs => 100 β€” number of jobs in inactive state.
  • 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 πŸ‘€


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