From 02f86c50203029a4b61325fe8da32e254827be5a Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 7 Oct 2021 09:21:51 +0200 Subject: [PATCH] [Messenger] Log when worker should stop and when `SIGTERM` is received --- .../FrameworkBundle/Resources/config/messenger.php | 3 +++ src/Symfony/Component/Messenger/CHANGELOG.md | 2 ++ .../StopWorkerOnSigtermSignalListener.php | 14 +++++++++++++- .../Component/Messenger/Tests/WorkerTest.php | 11 +++++++++++ src/Symfony/Component/Messenger/Worker.php | 4 ++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php index 68c97b7da84bc..813d503000de4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php @@ -193,6 +193,9 @@ ->tag('monolog.logger', ['channel' => 'messenger']) ->set('messenger.listener.stop_worker_on_sigterm_signal_listener', StopWorkerOnSigtermSignalListener::class) + ->args([ + service('logger')->ignoreOnInvalid(), + ]) ->tag('kernel.event_subscriber') ->set('messenger.listener.stop_worker_on_stop_exception_listener', StopWorkerOnCustomStopExceptionListener::class) diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 86c1d97234b00..c402c36e8273b 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -9,6 +9,8 @@ CHANGELOG * Added `WorkerMetadata` class which allows you to access the configuration details of a worker, like `queueNames` and `transportNames` it consumes from. * New method `getMetadata()` was added to `Worker` class which returns the `WorkerMetadata` object. * Deprecate not setting the `reset_on_message` config option, its default value will change to `true` in 6.0 + * Add log when worker should stop. + * Add log when `SIGTERM` is received. 5.3 --- diff --git a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php index 70b05b18b0acc..de5e86f9fb06d 100644 --- a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php +++ b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Messenger\EventListener; +use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Messenger\Event\WorkerStartedEvent; @@ -19,9 +20,20 @@ */ class StopWorkerOnSigtermSignalListener implements EventSubscriberInterface { + private $logger; + + public function __construct(LoggerInterface $logger = null) + { + $this->logger = $logger; + } + public function onWorkerStarted(WorkerStartedEvent $event): void { - pcntl_signal(\SIGTERM, static function () use ($event) { + pcntl_signal(\SIGTERM, function () use ($event) { + if (null !== $this->logger) { + $this->logger->info('Received SIGTERM signal.'); + } + $event->getWorker()->stop(); }); } diff --git a/src/Symfony/Component/Messenger/Tests/WorkerTest.php b/src/Symfony/Component/Messenger/Tests/WorkerTest.php index 6711a0febfea0..a5a3f902c669e 100644 --- a/src/Symfony/Component/Messenger/Tests/WorkerTest.php +++ b/src/Symfony/Component/Messenger/Tests/WorkerTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Tests; use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; @@ -329,6 +330,16 @@ public function testWorkerMessageReceivedEventMutability() $envelope = current($receiver->getAcknowledgedEnvelopes()); $this->assertCount(1, $envelope->all(\get_class($stamp))); } + + public function testWorkerShouldLogOnStop() + { + $bus = $this->createMock(MessageBusInterface::class); + $logger = $this->createMock(LoggerInterface::class); + $logger->expects($this->once())->method('info')->with('Stopping worker.'); + $worker = new Worker([], $bus, new EventDispatcher(), $logger); + + $worker->stop(); + } } class DummyReceiver implements ReceiverInterface diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index f32117529dbbe..f13ae72f8665f 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -176,6 +176,10 @@ private function handleMessage(Envelope $envelope, ReceiverInterface $receiver, public function stop(): void { + if (null !== $this->logger) { + $this->logger->info('Stopping worker.'); + } + $this->shouldStop = true; }