use
Getopt::Long
qw(GetOptionsFromArray :config no_auto_abbrev no_ignore_case)
;
has
description
=>
'Manage Minion jobs'
;
has
usage
=>
sub
{
shift
->extract_usage };
sub
run {
my
(
$self
,
@args
) =
@_
;
my
$args
= [];
my
$options
= {};
GetOptionsFromArray \
@args
,
'a|args=s'
=>
sub
{
$args
= decode_json(
$_
[1]) },
'd|delay=i'
=> \
$options
->{delay},
'e|enqueue=s'
=> \
my
$enqueue
,
'l|limit=i'
=> \(
my
$limit
= 100),
'o|offset=i'
=> \(
my
$offset
= 0),
'p|priority=i'
=> \
$options
->{priority},
'R|retry'
=> \
my
$retry
,
'r|remove'
=> \
my
$remove
,
'S|state=s'
=> \
$options
->{state},
's|stats'
=> \
my
$stats
,
't|task=s'
=> \
$options
->{task},
'w|workers'
=> \
my
$workers
;
my
$id
=
@args
?
shift
@args
:
undef
;
return
say
$self
->app->minion->enqueue(
$enqueue
,
$args
,
$options
)
if
$enqueue
;
return
$self
->_stats
if
$stats
;
return
$self
->_list_workers(
$offset
,
$limit
)
if
$workers
;
return
$self
->_list_jobs(
$offset
,
$limit
,
$options
)
unless
defined
$id
;
die
"Job does not exist.\n"
unless
my
$job
=
$self
->app->minion->job(
$id
);
return
$job
->remove ||
die
"Job is active.\n"
if
$remove
;
return
$job
->retry ||
die
"Job is active.\n"
if
$retry
;
$self
->_info(
$job
);
}
sub
_info {
my
(
$self
,
$job
) =
@_
;
my
$info
=
$job
->info;
my
(
$state
,
$priority
,
$retries
) =
@$info
{
qw(state priority retries)
};
say
$info
->{task},
" ($state, p$priority, r$retries)"
;
print
dumper
$info
->{args};
if
(
my
$result
=
$info
->{result}) {
print
dumper
$result
}
say
Mojo::Date->new(
$info
->{created})->to_datetime,
' (created)'
;
my
$delayed
=
$info
->{delayed};
say
Mojo::Date->new(
$delayed
)->to_datetime,
' (delayed)'
if
$delayed
>
time
;
my
$retried
=
$info
->{retried};
say
Mojo::Date->new(
$retried
)->to_datetime,
' (retried)'
if
$retried
;
my
$started
=
$info
->{started};
say
Mojo::Date->new(
$started
)->to_datetime,
' (started)'
if
$started
;
my
$finished
=
$info
->{finished};
say
Mojo::Date->new(
$finished
)->to_datetime,
' (finished)'
if
$finished
;
}
sub
_list_jobs {
my
$jobs
=
shift
->app->minion->backend->list_jobs(
@_
);
print
tablify [
map
{ [
@$_
{
qw(id state task)
}] }
@$jobs
];
}
sub
_list_workers {
my
$workers
=
shift
->app->minion->backend->list_workers(
@_
);
print
tablify [
map
{ [_worker()] }
@$workers
];
}
sub
_stats {
my
$stats
=
shift
->app->minion->stats;
say
"Inactive workers: $stats->{inactive_workers}"
;
say
"Active workers: $stats->{active_workers}"
;
say
"Inactive jobs: $stats->{inactive_jobs}"
;
say
"Active jobs: $stats->{active_jobs}"
;
say
"Failed jobs: $stats->{failed_jobs}"
;
say
"Finished jobs: $stats->{finished_jobs}"
;
}
sub
_worker {
$_
->{id}, @{
$_
->{jobs}} ?
'active'
:
'inactive'
,
"$_->{host}:$_->{pid}"
;
}
1;