From 9415b438b75204c72ff66b838307b73646393cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Pineau?= Date: Sun, 26 Feb 2023 12:37:36 -0500 Subject: [PATCH] [Messenger] make StopWorkerOnSignalsListener listen by default on SIGTERM and SIGINT --- UPGRADE-6.3.md | 1 + .../Resources/config/messenger.php | 5 +- src/Symfony/Component/Messenger/CHANGELOG.md | 3 + .../StopWorkerOnSignalsListener.php | 57 +++++++++++++++++++ .../StopWorkerOnSigtermSignalListener.php | 32 ++--------- 5 files changed, 70 insertions(+), 28 deletions(-) create mode 100644 src/Symfony/Component/Messenger/EventListener/StopWorkerOnSignalsListener.php diff --git a/UPGRADE-6.3.md b/UPGRADE-6.3.md index 2be9f5342b88..d219eb42e515 100644 --- a/UPGRADE-6.3.md +++ b/UPGRADE-6.3.md @@ -73,6 +73,7 @@ Messenger `Symfony\Component\Messenger\Transport\InMemoryTransportFactory` in favor of `Symfony\Component\Messenger\Transport\InMemory\InMemoryTransport` and `Symfony\Component\Messenger\Transport\InMemory\InMemoryTransportFactory` + * Deprecate `StopWorkerOnSigtermSignalListener` in favor of `StopWorkerOnSignalsListener` Notifier -------- diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php index 39030ce51132..db3f79a59372 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php @@ -23,7 +23,7 @@ use Symfony\Component\Messenger\EventListener\SendFailedMessageToFailureTransportListener; use Symfony\Component\Messenger\EventListener\StopWorkerOnCustomStopExceptionListener; use Symfony\Component\Messenger\EventListener\StopWorkerOnRestartSignalListener; -use Symfony\Component\Messenger\EventListener\StopWorkerOnSigtermSignalListener; +use Symfony\Component\Messenger\EventListener\StopWorkerOnSignalsListener; use Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware; use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware; use Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware; @@ -198,8 +198,9 @@ ->tag('kernel.event_subscriber') ->tag('monolog.logger', ['channel' => 'messenger']) - ->set('messenger.listener.stop_worker_on_sigterm_signal_listener', StopWorkerOnSigtermSignalListener::class) + ->set('messenger.listener.stop_worker_signals_listener', StopWorkerOnSignalsListener::class) ->args([ + null, service('logger')->ignoreOnInvalid(), ]) ->tag('kernel.event_subscriber') diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 49eb0e52e21e..8a16de384199 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -11,6 +11,9 @@ CHANGELOG `Symfony\Component\Messenger\Transport\InMemory\InMemoryTransportFactory` * Allow passing a string instead of an array in `TransportNamesStamp` * Allow to define batch size when using `BatchHandlerTrait` with `getBatchSize()` + * Deprecate `StopWorkerOnSigtermSignalListener` in favor of + `StopWorkerOnSignalsListener` and make it configurable with SIGINT and + SIGTERM by default 6.2 --- diff --git a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSignalsListener.php b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSignalsListener.php new file mode 100644 index 000000000000..e49e80fe295a --- /dev/null +++ b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSignalsListener.php @@ -0,0 +1,57 @@ + + * + * 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 Psr\Log\LoggerInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Messenger\Event\WorkerStartedEvent; + +/** + * @author Tobias Schultze + * @author Grégoire Pineau + */ +class StopWorkerOnSignalsListener implements EventSubscriberInterface +{ + private array $signals; + private ?LoggerInterface $logger; + + public function __construct(array $signals = null, LoggerInterface $logger = null) + { + if (null === $signals && \defined('SIGTERM')) { + $signals = [SIGTERM, SIGINT]; + } + $this->signals = $signals; + $this->logger = $logger; + } + + public function onWorkerStarted(WorkerStartedEvent $event): void + { + foreach ($this->signals as $signal) { + pcntl_signal($signal, function () use ($event, $signal) { + $this->logger?->info('Received signal {signal}.', ['signal' => $signal, 'transport_names' => $event->getWorker()->getMetadata()->getTransportNames()]); + + $event->getWorker()->stop(); + }); + } + } + + public static function getSubscribedEvents(): array + { + if (!\function_exists('pcntl_signal')) { + return []; + } + + return [ + WorkerStartedEvent::class => ['onWorkerStarted', 100], + ]; + } +} diff --git a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php index 7991c6cfd25e..eeddf7d5fc67 100644 --- a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php +++ b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php @@ -11,39 +11,19 @@ namespace Symfony\Component\Messenger\EventListener; +trigger_deprecation('symfony/messenger', '6.3', '"%s" is deprecated, use "%s" instead.', StopWorkerOnSigtermSignalListener::class, StopWorkerOnSignalsListener::class); + use Psr\Log\LoggerInterface; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\Messenger\Event\WorkerStartedEvent; /** * @author Tobias Schultze + * + * @deprecated since Symfony 6.3, use the StopWorkerOnSignalsListener instead */ -class StopWorkerOnSigtermSignalListener implements EventSubscriberInterface +class StopWorkerOnSigtermSignalListener extends StopWorkerOnSignalsListener { - private ?LoggerInterface $logger; - public function __construct(LoggerInterface $logger = null) { - $this->logger = $logger; - } - - public function onWorkerStarted(WorkerStartedEvent $event): void - { - pcntl_signal(\SIGTERM, function () use ($event) { - $this->logger?->info('Received SIGTERM signal.', ['transport_names' => $event->getWorker()->getMetadata()->getTransportNames()]); - - $event->getWorker()->stop(); - }); - } - - public static function getSubscribedEvents(): array - { - if (!\function_exists('pcntl_signal')) { - return []; - } - - return [ - WorkerStartedEvent::class => ['onWorkerStarted', 100], - ]; + parent::__construct([SIGTERM], $logger); } }