NAME
Minion::Job - Minion job
SYNOPSIS
package MyApp::Task::Foo;
use Mojo::Base 'Minion::Job', -signatures;
sub run ($self, @args) {
  # Magic here! :)
}
DESCRIPTION
Minion::Job is a container for Minion jobs.
EVENTS
Minion::Job inherits all events from Mojo::EventEmitter and can emit the following new ones.
cleanup
$job->on(cleanup => sub ($job) {
  ...
});
Emitted in the process performing this job right before the process will exit.
$job->on(cleanup => sub ($job) {
  $job->app->log->debug("Process $$ is about to exit");
});
failed
$job->on(failed => sub ($job, $err) {
  ...
});
Emitted in the worker process managing this job or the process performing it, after it has transitioned to the failed state.
$job->on(failed => sub ($job, $err) {
  say "Something went wrong: $err";
});
finish
$job->on(finish => sub ($job) {
  ...
});
Emitted in the process performing this job if the task was successful.
$job->on(finish => sub ($job) {
  my $id   = $job->id;
  my $task = $job->task;
  $job->app->log->debug(qq{Job "$id" was performed with task "$task"});
});
finished
$job->on(finished => sub ($job, $result) {
  ...
});
Emitted in the worker process managing this job or the process performing it, after it has transitioned to the finished state.
$job->on(finished => sub ($job, $result) {
  my $id = $job->id;
  say "Job $id is finished.";
});
reap
$job->on(reap => sub ($job, $pid) {
  ...
});
Emitted in the worker process managing this job, after the process performing it has exited.
$job->on(reap => sub ($job, $pid) {
  my $id = $job->id;
  say "Job $id ran in process $pid";
});
spawn
$job->on(spawn => sub ($job, $pid) {
  ...
});
Emitted in the worker process managing this job, after a new process has been spawned for processing.
$job->on(spawn => sub ($job, $pid) {
  my $id = $job->id;
  say "Job $id running in process $pid";
});
start
$job->on(start => sub ($job) {
  ...
});
Emitted in the process performing this job, after it has been spawned.
$job->on(start => sub ($job) {
  $0 = $job->id;
});
ATTRIBUTES
Minion::Job implements the following attributes.
args
my $args = $job->args;
$job     = $job->args([]);
Arguments passed to task.
id
my $id = $job->id;
$job   = $job->id($id);
Job id.
minion
my $minion = $job->minion;
$job       = $job->minion(Minion->new);
Minion object this job belongs to.
retries
my $retries = $job->retries;
$job        = $job->retries(5);
Number of times job has been retried.
task
my $task = $job->task;
$job     = $job->task('foo');
Task name.
METHODS
Minion::Job inherits all methods from Mojo::EventEmitter and implements the following new ones.
app
my $app = $job->app;
Get application from "app" in Minion.
# Longer version
my $app = $job->minion->app;
execute
my $err = $job->execute;
Perform job in this process and return undef if the task was successful or an exception otherwise. Note that this method should only be used to implement custom workers.
# Perform job in foreground
if (my $err = $job->execute) { $job->fail($err) }
else                         { $job->finish }
fail
my $bool = $job->fail;
my $bool = $job->fail('Something went wrong!');
my $bool = $job->fail({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.
finish
my $bool = $job->finish;
my $bool = $job->finish('All went well!');
my $bool = $job->finish({whatever => 'All went well!'});
Transition from active to finished state with or without a result.
info
my $info = $job->info;
Get job information.
# Check job state
my $state = $job->info->{state};
# Get job metadata
my $progress = $job->info->{notes}{progress};
# Get job result
my $result = $job->info->{result};
These fields are currently available:
- args
 - 
args => ['foo', 'bar']Job arguments.
 - attempts
 - 
attempts => 25Number of times performing this job will be attempted.
 - children
 - 
children => ['10026', '10027', '10028']Jobs depending on this job.
 - created
 - 
created => 784111777Epoch time job was created.
 - delayed
 - 
delayed => 784111777Epoch time job was delayed to.
 - expires
 - 
expires => 784111777Epoch time job is valid until before it expires.
 - finished
 - 
finished => 784111777Epoch time job was finished.
 - lax
 - 
lax => 0Existing 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 => 3Job priority.
 - queue
 - 
queue => 'important'Queue name.
 - result
 - 
result => 'All went well!'Job result.
 - retried
 - 
retried => 784111777Epoch time job has been retried.
 - retries
 - 
retries => 3Number of times job has been retried.
 - started
 - 
started => 784111777Epoch time job was started.
 - state
 - 
state => 'inactive'Current job state, usually
active,failed,finishedorinactive. - task
 - 
task => 'foo'Task name.
 - time
 - 
time => 784111777Server time.
 - worker
 - 
worker => '154'Id of worker that is processing the job.
 
is_finished
my $bool = $job->is_finished;
Check if job performed with "start" is finished. Note that this method should only be used to implement custom workers.
kill
$job->kill('INT');
Send a signal to job performed with "start". Note that this method should only be used to implement custom workers.
note
my $bool = $job->note(mojo => 'rocks', minion => 'too');
Change one or more metadata fields for this job. Setting a value to undef will remove the field. The new values will get serialized by "backend" in Minion (often with Mojo::JSON), so you shouldn't send objects and be careful with binary data, nested data structures with hash and array references are fine though.
# Share progress information
$job->note(progress => 95);
# Share stats
$job->note(stats => {utime => '0.012628', stime => '0.002429'});
parents
my $parents = $job->parents;
Return a Mojo::Collection object containing all jobs this job depends on as Minion::Job objects.
# Check parent state
for my $parent ($job->parents->each) {
  my $info = $parent->info;
  say "$info->{id}: $info->{state}";
}
perform
$job->perform;
Perform job in new process and wait for it to finish. Note that this method should only be used to implement custom workers.
pid
my $pid = $job->pid;
Process id of the process spawned by "start" if available. Note that this method should only be used to implement custom workers.
remove
my $bool = $job->remove;
Remove failed, finished or inactive job from queue.
retry
my $bool = $job->retry;
my $bool = $job->retry({delay => 10});
Transition job back to inactive state, already inactive jobs may also be retried to change options.
These options are currently available:
- attempts
 - 
attempts => 25Number of times performing this job will be attempted.
 - delay
 - 
delay => 10Delay job for this many seconds (from now), defaults to
0. - expire
 - 
expire => 300Job is valid for this many seconds (from now) before it expires.
 - lax
 - 
lax => 1Existing jobs this job depends on may also have transitioned to the
failedstate to allow for it to be processed, defaults tofalse. - parents
 - 
parents => [$id1, $id2, $id3]Jobs this job depends on.
 - priority
 - 
priority => 5Job priority.
 - queue
 - 
queue => 'important'Queue to put job in.
 
run
$job->run(@args);
Task to perform by this job. Meant to be overloaded in a subclass to create a custom task class. Note that this method is EXPERIMENTAL and might change without warning!
start
$job = $job->start;
Perform job in new process, but do not wait for it to finish. Note that this method should only be used to implement custom workers.
# Perform two jobs concurrently
$job1->start;
$job2->start;
my ($first, $second);
sleep 1
  until $first ||= $job1->is_finished and $second ||= $job2->is_finished;
stop
$job->stop;
Stop job performed with "start" immediately. Note that this method should only be used to implement custom workers.
SEE ALSO
Minion, Minion::Guide, https://minion.pm, Mojolicious::Guides, https://mojolicious.org.