Skip to content

Commit 6430e04

Browse files
committed
[Messenger] make StopWorkerOnSignalsListener listen by default on SIGTERM and SIGINT
1 parent f4fe1c1 commit 6430e04

File tree

5 files changed

+90
-33
lines changed

5 files changed

+90
-33
lines changed

UPGRADE-6.3.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Messenger
6565
`Symfony\Component\Messenger\Transport\InMemoryTransportFactory` in favor of
6666
`Symfony\Component\Messenger\Transport\InMemory\InMemoryTransport` and
6767
`Symfony\Component\Messenger\Transport\InMemory\InMemoryTransportFactory`
68+
* Deprecate `StopWorkerOnSigtermSignalListener` in favor of `StopWorkerOnSignalsListener`
6869

6970
Notifier
7071
--------

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Symfony\Component\Messenger\EventListener\SendFailedMessageToFailureTransportListener;
2424
use Symfony\Component\Messenger\EventListener\StopWorkerOnCustomStopExceptionListener;
2525
use Symfony\Component\Messenger\EventListener\StopWorkerOnRestartSignalListener;
26+
use Symfony\Component\Messenger\EventListener\StopWorkerOnSignalsListener;
2627
use Symfony\Component\Messenger\EventListener\StopWorkerOnSigtermSignalListener;
2728
use Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware;
2829
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
@@ -45,7 +46,8 @@
4546
use Symfony\Component\Messenger\Transport\TransportFactory;
4647

4748
return static function (ContainerConfigurator $container) {
48-
$container->services()
49+
$services = $container->services();
50+
$services
4951
->alias(SerializerInterface::class, 'messenger.default_serializer')
5052

5153
// Asynchronous
@@ -198,12 +200,6 @@
198200
->tag('kernel.event_subscriber')
199201
->tag('monolog.logger', ['channel' => 'messenger'])
200202

201-
->set('messenger.listener.stop_worker_on_sigterm_signal_listener', StopWorkerOnSigtermSignalListener::class)
202-
->args([
203-
service('logger')->ignoreOnInvalid(),
204-
])
205-
->tag('kernel.event_subscriber')
206-
207203
->set('messenger.listener.stop_worker_on_stop_exception_listener', StopWorkerOnCustomStopExceptionListener::class)
208204
->tag('kernel.event_subscriber')
209205

@@ -218,4 +214,24 @@
218214
service('messenger.default_bus'),
219215
])
220216
;
217+
218+
if (class_exists(StopWorkerOnSignalsListener::class)) {
219+
$services
220+
->set('messenger.listener.stop_worker_signals_listener', StopWorkerOnSignalsListener::class)
221+
->args([
222+
null,
223+
service('logger')->ignoreOnInvalid(),
224+
])
225+
->tag('kernel.event_subscriber')
226+
;
227+
} else {
228+
// BC layer for symfony/messenger < 5.3
229+
$services
230+
->set('messenger.listener.stop_worker_on_sigterm_signal_listener', StopWorkerOnSigtermSignalListener::class)
231+
->args([
232+
service('logger')->ignoreOnInvalid(),
233+
])
234+
->tag('kernel.event_subscriber')
235+
;
236+
}
221237
};

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ CHANGELOG
1111
`Symfony\Component\Messenger\Transport\InMemory\InMemoryTransportFactory`
1212
* Allow passing a string instead of an array in `TransportNamesStamp`
1313
* Allow to define batch size when using `BatchHandlerTrait` with `getBatchSize()`
14+
* Deprecate `StopWorkerOnSigtermSignalListener` in favor of
15+
`StopWorkerOnSignalsListener` and make it configurable with SIGINT and
16+
SIGTERM by default
1417

1518
6.2
1619
---
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\EventListener;
13+
14+
use Psr\Log\LoggerInterface;
15+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16+
use Symfony\Component\Messenger\Event\WorkerStartedEvent;
17+
18+
/**
19+
* @author Tobias Schultze <http://tobion.de>
20+
* @author Grégoire Pineau <lyrixx@lyrixx.info>
21+
*/
22+
class StopWorkerOnSignalsListener implements EventSubscriberInterface
23+
{
24+
private array $signals;
25+
private ?LoggerInterface $logger;
26+
27+
public function __construct(array $signals = null, LoggerInterface $logger = null)
28+
{
29+
if (null === $signals && \defined('SIGTERM')) {
30+
$signals = [SIGTERM, SIGINT];
31+
}
32+
$this->signals = $signals;
33+
$this->logger = $logger;
34+
}
35+
36+
public function onWorkerStarted(WorkerStartedEvent $event): void
37+
{
38+
foreach ($this->signals as $signal) {
39+
pcntl_signal($signal, function () use ($event, $signal) {
40+
$this->logger?->info('Received signal {signal}.', ['signal' => $signal, 'transport_names' => $event->getWorker()->getMetadata()->getTransportNames()]);
41+
42+
$event->getWorker()->stop();
43+
});
44+
}
45+
}
46+
47+
public static function getSubscribedEvents(): array
48+
{
49+
if (!\function_exists('pcntl_signal')) {
50+
return [];
51+
}
52+
53+
return [
54+
WorkerStartedEvent::class => ['onWorkerStarted', 100],
55+
];
56+
}
57+
}

src/Symfony/Component/Messenger/EventListener/StopWorkerOnSigtermSignalListener.php

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,19 @@
1111

1212
namespace Symfony\Component\Messenger\EventListener;
1313

14+
trigger_deprecation('symfony/messenger', '6.3', '"%s" is deprecated, use "%s" instead.', StopWorkerOnSigtermSignalListener::class, StopWorkerOnSignalsListener::class);
15+
1416
use Psr\Log\LoggerInterface;
15-
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16-
use Symfony\Component\Messenger\Event\WorkerStartedEvent;
1717

1818
/**
1919
* @author Tobias Schultze <http://tobion.de>
20+
*
21+
* @deprecated since Symfony 6.3, use the StopWorkerOnSignalsListener instead
2022
*/
21-
class StopWorkerOnSigtermSignalListener implements EventSubscriberInterface
23+
class StopWorkerOnSigtermSignalListener extends StopWorkerOnSignalsListener
2224
{
23-
private ?LoggerInterface $logger;
24-
2525
public function __construct(LoggerInterface $logger = null)
2626
{
27-
$this->logger = $logger;
28-
}
29-
30-
public function onWorkerStarted(WorkerStartedEvent $event): void
31-
{
32-
pcntl_signal(\SIGTERM, function () use ($event) {
33-
$this->logger?->info('Received SIGTERM signal.', ['transport_names' => $event->getWorker()->getMetadata()->getTransportNames()]);
34-
35-
$event->getWorker()->stop();
36-
});
37-
}
38-
39-
public static function getSubscribedEvents(): array
40-
{
41-
if (!\function_exists('pcntl_signal')) {
42-
return [];
43-
}
44-
45-
return [
46-
WorkerStartedEvent::class => ['onWorkerStarted', 100],
47-
];
27+
parent::__construct([SIGTERM], $logger);
4828
}
4929
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy