2019-09-10 23:10:57 +00:00
|
|
|
<?php
|
2020-10-14 22:19:31 +00:00
|
|
|
|
2021-07-19 05:53:45 +00:00
|
|
|
declare(strict_types=1);
|
|
|
|
|
2020-09-21 14:06:24 +00:00
|
|
|
namespace App\Console\Command\MessageQueue;
|
2019-09-10 23:10:57 +00:00
|
|
|
|
2020-09-21 14:06:24 +00:00
|
|
|
use App\Console\Command\CommandAbstract;
|
2020-06-28 23:00:00 +00:00
|
|
|
use App\Doctrine\Messenger\ClearEntityManagerSubscriber;
|
2021-02-22 04:19:02 +00:00
|
|
|
use App\Environment;
|
2020-06-28 16:29:22 +00:00
|
|
|
use App\EventDispatcher;
|
2020-10-22 12:29:40 +00:00
|
|
|
use App\MessageQueue\LogWorkerExceptionSubscriber;
|
2020-09-26 23:05:33 +00:00
|
|
|
use App\MessageQueue\QueueManager;
|
2021-04-18 05:03:22 +00:00
|
|
|
use App\MessageQueue\ResetArrayCacheMiddleware;
|
2019-09-10 23:10:57 +00:00
|
|
|
use Psr\Log\LoggerInterface;
|
2020-06-28 16:29:22 +00:00
|
|
|
use Symfony\Component\Messenger\EventListener\StopWorkerOnTimeLimitListener;
|
|
|
|
use Symfony\Component\Messenger\MessageBus;
|
|
|
|
use Symfony\Component\Messenger\Worker;
|
2021-04-23 22:12:47 +00:00
|
|
|
use Throwable;
|
2019-09-10 23:10:57 +00:00
|
|
|
|
2020-09-21 14:06:24 +00:00
|
|
|
class ProcessCommand extends CommandAbstract
|
2019-09-10 23:10:57 +00:00
|
|
|
{
|
|
|
|
public function __invoke(
|
2020-06-28 16:29:22 +00:00
|
|
|
MessageBus $messageBus,
|
|
|
|
EventDispatcher $eventDispatcher,
|
2020-09-26 23:05:33 +00:00
|
|
|
QueueManager $queueManager,
|
2019-09-10 23:10:57 +00:00
|
|
|
LoggerInterface $logger,
|
2021-02-22 04:19:02 +00:00
|
|
|
Environment $environment,
|
|
|
|
?int $runtime = 0,
|
2020-11-15 00:06:34 +00:00
|
|
|
?string $workerName = null
|
2020-10-14 22:19:31 +00:00
|
|
|
): int {
|
2020-12-10 02:14:38 +00:00
|
|
|
$logger->notice(
|
|
|
|
'Starting new Message Queue worker process.',
|
|
|
|
[
|
|
|
|
'runtime' => $runtime,
|
|
|
|
'workerName' => $workerName,
|
|
|
|
]
|
|
|
|
);
|
2020-10-22 12:29:40 +00:00
|
|
|
|
2020-11-15 00:06:34 +00:00
|
|
|
if (null !== $workerName) {
|
|
|
|
$queueManager->setWorkerName($workerName);
|
|
|
|
}
|
2020-11-15 00:59:37 +00:00
|
|
|
|
2020-09-26 23:05:33 +00:00
|
|
|
$receivers = $queueManager->getTransports();
|
2020-06-28 16:29:22 +00:00
|
|
|
|
2020-10-22 12:29:40 +00:00
|
|
|
$eventDispatcher->addServiceSubscriber(ClearEntityManagerSubscriber::class);
|
|
|
|
$eventDispatcher->addServiceSubscriber(LogWorkerExceptionSubscriber::class);
|
2021-04-18 05:03:22 +00:00
|
|
|
$eventDispatcher->addServiceSubscriber(ResetArrayCacheMiddleware::class);
|
2020-06-28 23:00:00 +00:00
|
|
|
|
2021-02-22 04:19:02 +00:00
|
|
|
if ($runtime <= 0) {
|
|
|
|
$runtime = $environment->isProduction()
|
|
|
|
? 300
|
|
|
|
: 30;
|
2019-09-10 23:10:57 +00:00
|
|
|
}
|
|
|
|
|
2021-02-22 04:19:02 +00:00
|
|
|
$eventDispatcher->addSubscriber(new StopWorkerOnTimeLimitListener($runtime, $logger));
|
|
|
|
|
2020-12-10 02:14:38 +00:00
|
|
|
try {
|
|
|
|
$worker = new Worker($receivers, $messageBus, $eventDispatcher, $logger);
|
|
|
|
$worker->run();
|
2021-04-23 22:12:47 +00:00
|
|
|
} catch (Throwable $e) {
|
2020-12-10 02:14:38 +00:00
|
|
|
$logger->error(
|
|
|
|
sprintf('Message queue error: %s', $e->getMessage()),
|
|
|
|
[
|
|
|
|
'workerName' => $workerName,
|
|
|
|
'exception' => $e,
|
|
|
|
]
|
|
|
|
);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2020-06-28 16:29:22 +00:00
|
|
|
|
|
|
|
return 0;
|
2019-09-10 23:10:57 +00:00
|
|
|
}
|
|
|
|
}
|