Minion::Backend::mysql
version 1.006
use Mojolicious::Lite;
plugin Minion => {mysql => 'mysql://user@127.0.0.1/minion_jobs'};
# Slow task
app->minion->add_task(poke_mojo => sub {
my $job = shift;
$job->app->ua->get('mojolicio.us');
$job->app->log->debug('We have poked mojolicio.us for a visitor');
});
# Perform job in a background worker process
get '/' => sub {
my $c = shift;
$c->minion->enqueue('poke_mojo');
$c->render(text => 'We will poke mojolicio.us for you soon.');
};
app->start;
Minion::Backend::mysql is a backend for Minion based on Mojo::mysql. All
necessary tables will be created automatically with a set of migrations named
minion
. This backend requires at least v5.6.5 of MySQL.
Minion::Backend::mysql - MySQL backend
Minion::Backend::mysql inherits all attributes from Minion::Backend and implements the following new ones.
my $mysql = $backend->mysql;
$backend = $backend->mysql(Mojo::mysql->new);
Mojo::mysql object used to store all data.
If true, will not make a transaction around the "enqueue" insertions when a job has parent jobs. Without a transaction, the job could be dequeued before its parent relationships are written to the database. However, since MySQL does not support nested transactions (despite supporting something almost exactly like them...), you can disable transactions for testing by setting this attribute (if you perform your tests in a transaction so they can be rolled back when the test is complete).
Minion::Backend::mysql inherits all methods from Minion::Backend and implements the following new ones.
my $job_info = $backend->dequeue($worker_id, 0.5);
my $job_info = $backend->dequeue($worker_id, 0.5, {queues => ['important']});
Wait for job, dequeue it and transition from inactive
to active
state or
return undef
if queues were empty.
These options are currently available:
queues
queues => ['important']
One or more queues to dequeue jobs from, defaults to default
.
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.
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.
These options are currently available:
delay
delay => 10
Delay job for this many seconds (from now).
priority
priority => 5
Job priority, defaults to 0
.
queue
queue => 'important'
Queue to put job in, defaults to default
.
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, {msg => 'Something went wrong!'});
Transition from active
to failed
state.
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, {msg => 'All went well!'});
Transition from active
to finished
state.
my $job_info = $backend->job_info($job_id);
Get information about a job or return undef
if job does not exist.
# Check job state
my $state = $backend->job_info($job_id)->{state};
# Get job result
my $result = $backend->job_info($job_id)->{result};
These fields are currently available:
args
args => ['foo', 'bar']
Job arguments.
created
created => 784111777
Time job was created.
delayed
delayed => 784111777
Time job was delayed to.
finished
finished => 784111777
Time job was finished.
priority
priority => 3
Job priority.
queue
queue => 'important'
Queue name.
result
result => 'All went well!'
Job result.
retried
retried => 784111777
Time job has been retried.
retries
retries => 3
Number of times job has been retried.
started
started => 784111777
Time job was started.
state
state => 'inactive'
Current job state, usually active
, failed
, finished
or inactive
.
task
task => 'foo'
Task name.
worker
worker => '154'
Id of worker that is processing the job.
my $batch = $backend->list_jobs($offset, $limit);
my $batch = $backend->list_jobs($offset, $limit, {states => 'inactive'});
Returns the same information as "job_info" but in batches.
These options are currently available:
state
state => 'inactive'
List only jobs in this state.
task
task => 'test'
List only jobs for this task.
my $batch = $backend->list_workers($offset, $limit);
Returns the same information as "worker_info" but in batches.
my $backend = Minion::Backend::mysql->new('mysql://mysql@/test');
Construct a new Minion::Backend::mysql object.
my $worker_id = $backend->register_worker;
my $worker_id = $backend->register_worker($worker_id);
Register worker or send heartbeat to show that this worker is still alive.
my $bool = $backend->remove_job($job_id);
Remove failed
, finished
or inactive
job from queue.
$backend->repair;
Repair worker registry and job queue if necessary.
$backend->reset;
Reset job queue.
my $bool = $backend->retry_job($job_id, $retries);
my $bool = $backend->retry_job($job_id, $retries, {delay => 10});
Transition from failed
or finished
state back to inactive
.
These options are currently available:
delay
delay => 10
Delay job for this many seconds (from now).
parents
parents => [$id1, $id2, $id3]
Jobs this job depends on.
priority
priority => 5
Job priority.
queue
queue => 'important'
Queue to put job in.
my $stats = $backend->stats;
Get statistics for jobs and workers.
$backend->unregister_worker($worker_id);
Unregister worker.
my $worker_info = $backend->worker_info($worker_id);
Get information about a worker or return undef
if worker does not exist.
# Check worker host
my $host = $backend->worker_info($worker_id)->{host};
These fields are currently available:
host
host => 'localhost'
Worker host.
jobs
jobs => ['10023', '10024', '10025', '10029']
Ids of jobs the worker is currently processing.
notified
notified => 784111777
Last time worker sent a heartbeat.
pid
pid => 12345
Process id of worker.
started
started => 784111777
Time worker was started.
This may happen when the SQL create/upgrade scripts fail to run
completely due to permission errors. Re-running with the environment
variable MOJO_MIGRATIONS_DEBUG=1
should produce the error message
returned by the database.
A common reason for the database install to fail on MySQL >= 8 is that
the user installing the database does not have SUPER
privileges
needed to create functions when binlogs are enabled: (DBD::mysql::st execute failed: You do not have the SUPER privilege and binary logging is enabled
). See the MySQL documentation for Stored Program Binary
Logging
for more information about this problem and how to correct it.
Minion, Mojolicious::Guides, http://mojolicio.us.
This software is copyright (c) 2021 by Doug Bell and Brian Medley.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.