Created by
Brian Medley
| use Mojolicious::Lite;
use 5.20.0;
use experimental 'signatures';
use Mojo::Util qw(steady_time);
plugin Minion => {Pg => "postgresql://$ENV{DBI_USER}:$ENV{DBI_PASS}\@127.0.0.1/jobs"};
app->minion->add_task(email_photo => sub ($job, $photo) {
$job->app->log->debug(qq{Received message $photo : } . steady_time);
select(undef, undef, undef, rand);
$job->app->log->debug(qq{Processd message $photo : } . steady_time);
});
app->minion->add_task(convert_photo => sub ($job, $photo) {
$job->app->log->debug(qq{Received message $photo : } . steady_time);
select(undef, undef, undef, rand);
$job->app->log->debug(qq{Processd message $photo : } . steady_time);
});
app->minion->add_task(resize_photo => sub ($job, $photo) {
$job->app->log->debug(qq{Received message $photo : } . steady_time);
select(undef, undef, undef, rand);
$job->app->log->debug(qq{Processd message $photo : } . steady_time);
});
app->minion->add_task(crop_photo => sub ($job, $photo) {
$job->app->log->debug(qq{Received message $photo : } . steady_time);
select(undef, undef, undef, rand);
$job->app->log->debug(qq{Processd message $photo : } . steady_time);
});
app->minion->add_task(independent => sub ($job, $time) {
$job->app->log->debug(qq{Received message $time : } . steady_time);
select(undef, undef, undef, rand);
$job->app->log->debug(qq{Processd message $time : } . steady_time);
});
get '/' => sub {
my $c = shift;
$c->render(json => {number => 4});
};
get '/photo' => sub ($c) {
my $time = steady_time;
my @chain = (
[ convert_photo => "yippie.png: $time", [] ],
[ resize_photo => "yippie.png: $time", [priority => 5] ],
[ crop_photo => "yippie.png: $time", [] ],
[ email_photo => "yippie.png: $time", [priority => 10] ],
);
foreach my $chain (@chain) {
state $deps = [];
my $task = shift(@{ $chain });
my $ops = pop(@{ $chain });
push(@{ $deps }, $c->minion->enqueue($task, $chain, {@{$ops}, depends_on => $deps}));
$c->minion->enqueue("independent", [$time], {priority => 3}) if int(rand(2));
}
$c->minion->enqueue("independent", [$time]);
$c->render(text => 'Your photo will be done soon.');
};
app->start;
|