package Minion::Job;
has args => sub { [] };
has [qw(id minion task)];
sub app { shift->minion->app }
sub fail {
my $self = shift;
my $err = shift // 'Unknown error.';
return $self->minion->backend->fail_job($self->id, $err)
? !!$self->emit(failed => $err)
: undef;
}
sub finish {
my $self = shift;
return $self->minion->backend->finish_job($self->id)
? !!$self->emit('finished')
: undef;
}
sub info { $_[0]->minion->backend->job_info($_[0]->id) }
sub perform {
my $self = shift;
waitpid $self->_child, 0;
$? ? $self->fail('Non-zero exit status.') : $self->finish;
}
sub remove { $_[0]->minion->backend->remove_job($_[0]->id) }
sub restart { $_[0]->minion->backend->restart_job($_[0]->id) }
sub _child {
my $self = shift;
# Parent
die "Can't fork: $!" unless defined(my $pid = fork);
return $pid if $pid;
# Child
my $task = $self->task;
$self->app->log->debug(qq{Performing job "$task" (@{[$self->id]}:$$).});
my $cb = $self->minion->tasks->{$task};
$self->fail($@) unless eval { $self->$cb(@{$self->args}); 1 };
exit 0;
}
1;
=encoding utf8
=head1 NAME
Minion::Job - Minion job
=head1 SYNOPSIS
use Minion::Job;
my $job = Minion::Job->new(id => $id, minion => $minion, task => 'foo');
=head1 DESCRIPTION
L<Minion::Job> is a container for L<Minion> jobs.
=head1 EVENTS
L<Minion::Job> inherits all events from L<Mojo::EventEmitter> and can emit the
following new ones.
=head2 failed
$job->on(failed => sub {
my ($job, $err) = @_;
...
});
Emitted after this job transitioned to the C<failed> state.
$job->on(failed => sub {
my ($job, $err) = @_;
say "Something went wrong: $err";
});
=head2 finished
$job->on(finished => sub {
my $job = shift;
...
});
Emitted after this job transitioned to the C<finished> state.
$job->on(finished => sub {
my $job = shift;
my $id = $job->id;
say "Job $id is finished.";
});
=head1 ATTRIBUTES
L<Minion::Job> implements the following attributes.
=head2 args
my $args = $job->args;
$job = $job->args([]);
Arguments passed to task.
=head2 id
my $id = $job->id;
$job = $job->id($id);
Job id.
=head2 minion
my $minion = $job->minion;
$job = $job->minion(Minion->new);
L<Minion> object this job belongs to.
=head2 task
my $task = $job->task;
$job = $job->task('foo');
Task name.
=head1 METHODS
L<Minion::Job> inherits all methods from L<Mojo::EventEmitter> and implements
the following new ones.
=head2 app
my $app = $job->app;
Get application from L<Minion/"app">.
# Longer version
my $app = $job->minion->app;
=head2 fail
my $bool = $job->fail;
my $bool = $job->fail('Something went wrong!');
Transition from C<active> to C<failed> state.
=head2 finish
my $bool = $job->finish;
Transition from C<active> to C<finished> state.
=head2 info
my $info = $job->info;
Get job information.
=head2 perform
$job->perform;
Perform job in new process and wait for it to finish.
=head2 remove
my $bool = $job->remove;
Remove C<failed>, C<finished> or C<inactive> job from queue.
=head2 restart
my $bool = $job->restart;
Transition from C<failed> or C<finished> state back to C<inactive>.
=head1 SEE ALSO
L<Minion>, L<Mojolicious::Guides>, L<http://mojolicio.us>.
=cut