NAME
Minion::Backend::mysql
VERSION
version 1.002
SYNOPSIS
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;
DESCRIPTION
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.
NAME
Minion::Backend::mysql - MySQL backend
ATTRIBUTES
Minion::Backend::mysql inherits all attributes from Minion::Backend and implements the following new ones.
mysql
my $mysql = $backend->mysql;
$backend = $backend->mysql(Mojo::mysql->new);
Mojo::mysql object used to store all data.
no_txn
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).
METHODS
Minion::Backend::mysql inherits all methods from Minion::Backend and implements the following new ones.
dequeue
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.
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.
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
.
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, {msg => 'Something went wrong!'});
Transition from active
to failed
state.
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, {msg => 'All went well!'});
Transition from active
to finished
state.
job_info
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
orinactive
. - task
-
task => 'foo'
Task name.
- worker
-
worker => '154'
Id of worker that is processing the job.
list_jobs
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.
list_workers
my $batch = $backend->list_workers($offset, $limit);
Returns the same information as "worker_info" but in batches.
new
my $backend = Minion::Backend::mysql->new('mysql://mysql@/test');
Construct a new Minion::Backend::mysql object.
register_worker
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.
remove_job
my $bool = $backend->remove_job($job_id);
Remove failed
, finished
or inactive
job from queue.
repair
$backend->repair;
Repair worker registry and job queue if necessary.
reset
$backend->reset;
Reset job queue.
retry_job
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.
stats
my $stats = $backend->stats;
Get statistics for jobs and workers.
unregister_worker
$backend->unregister_worker($worker_id);
Unregister worker.
worker_info
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.
ERRORS
DBD::mysql::st execute failed: Table '*.minion_workers' doesn't exist
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.
SEE ALSO
Minion, Mojolicious::Guides, http://mojolicio.us.
AUTHORS
Brian Medley <bpmedley@cpan.org>
Doug Bell <preaction@cpan.org>
CONTRIBUTORS
Alexander Nalobin <nalobin@reg.ru>
Dmitry Krylov <pentabion@gmail.com>
Hu Yin <huyin8@gmail.com>
Jason A. Crome <jcrome@empoweredbenefits.com>
Larry Leszczynski <larryl@cpan.org>
Larry Leszczynski <larryl@emailplus.org>
Olaf Alders <olaf@wundersolutions.com>
Paul Cochrane <paul@liekut.de>
Sergey Andreev <40195653+saintserge@users.noreply.github.com>
Zoffix Znet <cpan@zoffix.com>
COPYRIGHT AND LICENSE
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.