1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace SfCod\QueueBundle\Command; |
4
|
|
|
|
5
|
|
|
use SfCod\QueueBundle\Entity\Job; |
6
|
|
|
use SfCod\QueueBundle\Failer\FailedJobProviderInterface; |
7
|
|
|
use SfCod\QueueBundle\Service\JobQueue; |
8
|
|
|
use Symfony\Component\Console\Command\Command; |
9
|
|
|
use Symfony\Component\Console\Input\InputInterface; |
10
|
|
|
use Symfony\Component\Console\Input\InputOption; |
11
|
|
|
use Symfony\Component\Console\Output\OutputInterface; |
12
|
|
|
use Symfony\Component\Console\Style\SymfonyStyle; |
13
|
|
|
|
14
|
|
|
/** |
15
|
|
|
* Class ReleaseFailedCommand |
16
|
|
|
* |
17
|
|
|
* @author Virchenko Maksim <[email protected]> |
18
|
|
|
* |
19
|
|
|
* @package SfCod\QueueBundle\Command |
20
|
|
|
*/ |
21
|
|
|
class RetryCommand extends Command |
22
|
|
|
{ |
23
|
|
|
/** |
24
|
|
|
* @var JobQueue |
25
|
|
|
*/ |
26
|
|
|
protected $queue; |
27
|
|
|
|
28
|
|
|
/** |
29
|
|
|
* @var FailedJobProviderInterface |
30
|
|
|
*/ |
31
|
|
|
protected $failer; |
32
|
|
|
|
33
|
|
|
/** |
34
|
|
|
* RetryCommand constructor. |
35
|
|
|
* |
36
|
|
|
* @param JobQueue $queue |
37
|
|
|
* @param FailedJobProviderInterface $failer |
38
|
|
|
*/ |
39
|
|
|
public function __construct(JobQueue $queue, FailedJobProviderInterface $failer) |
40
|
|
|
{ |
41
|
|
|
$this->queue = $queue; |
42
|
|
|
$this->failer = $failer; |
43
|
|
|
|
44
|
|
|
parent::__construct(); |
45
|
|
|
} |
46
|
|
|
|
47
|
|
|
/** |
48
|
|
|
* Configure command |
49
|
|
|
*/ |
50
|
|
|
protected function configure() |
51
|
|
|
{ |
52
|
|
|
$this->setName('job-queue:retry') |
53
|
|
|
->setDescription('Release failed job(s).') |
54
|
|
|
->addOption('id', null, InputOption::VALUE_OPTIONAL, 'Job id to retry, if not set all failed jobs will be affected.', null); |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* Execute command |
59
|
|
|
* |
60
|
|
|
* @param InputInterface $input |
61
|
|
|
* @param OutputInterface $output |
62
|
|
|
* |
63
|
|
|
* @return int|void|null |
64
|
|
|
*/ |
65
|
|
|
public function execute(InputInterface $input, OutputInterface $output) |
66
|
|
|
{ |
67
|
|
|
$io = new SymfonyStyle($input, $output); |
68
|
|
|
|
69
|
|
|
$jobsCount = 0; |
70
|
|
|
if (is_null($input->getOption('id'))) { |
71
|
|
|
foreach ($this->failer->all() as $job) { |
72
|
|
|
if ($this->retryJob($job)) { |
73
|
|
|
++$jobsCount; |
74
|
|
|
} |
75
|
|
|
} |
76
|
|
|
} else { |
77
|
|
|
$job = $this->failer->find($input->getOption('id')); |
78
|
|
|
|
79
|
|
|
if ($job) { |
80
|
|
|
$this->retryJob($job); |
81
|
|
|
|
82
|
|
|
++$jobsCount; |
83
|
|
|
} |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
$io->success(sprintf("[%d] job(s) has been released.\n", $jobsCount)); |
87
|
|
|
|
88
|
|
|
return 0; |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
/** |
92
|
|
|
* Retry job |
93
|
|
|
* |
94
|
|
|
* @param Job $job |
95
|
|
|
* |
96
|
|
|
* @return bool |
97
|
|
|
*/ |
98
|
|
|
protected function retryJob(Job $job): bool |
99
|
|
|
{ |
100
|
|
|
$payload = $job->getPayload(); |
101
|
|
|
|
102
|
|
|
if ($payload && isset($payload['job'], $payload['data'])) { |
|
|
|
|
103
|
|
|
$this->queue->push($payload['job'], $payload['data']); |
104
|
|
|
$this->failer->forget($job->getId()); |
105
|
|
|
|
106
|
|
|
return true; |
107
|
|
|
} |
108
|
|
|
|
109
|
|
|
return false; |
110
|
|
|
} |
111
|
|
|
} |
112
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.