<?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Messenger\EventListener;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;use Symfony\Component\Messenger\Event\WorkerRunningEvent;use Symfony\Component\Messenger\Exception\HandlerFailedException;use Symfony\Component\Messenger\Exception\StopWorkerExceptionInterface;/** * @author Grégoire Pineau <lyrixx@lyrixx.info> */class StopWorkerOnCustomStopExceptionListener implements EventSubscriberInterface{ private $stop = false; public function onMessageFailed(WorkerMessageFailedEvent $event): void { $th = $event->getThrowable(); if ($th instanceof StopWorkerExceptionInterface) { $this->stop = true; } if ($th instanceof HandlerFailedException) { foreach ($th->getNestedExceptions() as $e) { if ($e instanceof StopWorkerExceptionInterface) { $this->stop = true; break; } } } } public function onWorkerRunning(WorkerRunningEvent $event): void { if ($this->stop) { $event->getWorker()->stop(); } } public static function getSubscribedEvents(): array { return [ WorkerMessageFailedEvent::class => 'onMessageFailed', WorkerRunningEvent::class => 'onWorkerRunning', ]; }}