diff --git a/src/console/QueueController.php b/src/console/QueueController.php index 6c9b05c..4ac6860 100644 --- a/src/console/QueueController.php +++ b/src/console/QueueController.php @@ -20,6 +20,7 @@ use yii\queue\ErrorEvent; use yii\queue\JobEvent; use yii\queue\Queue; +use yii\queue\cli\Queue as CliQueue; /** * Manages service Queue. @@ -71,10 +72,11 @@ public function actionTestErrorHandler() private function ensureLimits() { - if (++$this->executedJobsCount >= static::MAX_EXECUTED_JOBS && function_exists('posix_kill')) { - $this->stdout('Reached limit of ' . static::MAX_EXECUTED_JOBS . " executed jobs. Stopping process.\n"); - Signal::setExitFlag(); + if ($this->executedJobsCount++ > static::MAX_EXECUTED_JOBS && function_exists('posix_kill')) { + return 15; // SIGTERM } + + return null; } /** @@ -102,6 +104,14 @@ private function attachEventHandlers() $out("%RJob '" . get_class($event->job) . "' finished with error:%n '" . $event->error . "'\n"); }); + Event::on(Queue::class, CliQueue::EVENT_WORKER_LOOP, function (\yii\queue\cli\WorkerEvent $event) use ($out) { + $exitCode = $this->ensureLimits(); + if ($exitCode !== null) { + $out('Reached limit of ' . static::MAX_EXECUTED_JOBS . " executed jobs. Stopping process.\n"); + $event->exitCode = $exitCode; + } + }); + Event::on(AbstractPackageCommand::class, AbstractPackageCommand::EVENT_BEFORE_RUN, function ($event) use ($out) { /** @var AbstractPackageCommand $command */ $command = $event->sender;