The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Minion::Backend::mysql

VERSION

version 0.28

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" queries. Without a transaction, a 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 or inactive.

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.

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>

  • 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.