8000 Fixes #43866 configurable stop signals for messenger · symfony/symfony@2aef839 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2aef839

Browse files
committed
Fixes #43866 configurable stop signals for messenger
1 parent 8e8207b commit 2aef839

File tree

7 files changed

+127
-30
lines changed

7 files changed

+127
-30
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,20 @@ private function addMessengerSection(ArrayNodeDefinition $rootNode, callable $en
13081308
->then(static function (array $v): void { throw new InvalidConfigurationException(sprintf('The specified default bus "%s" is not configured. Available buses are "%s".', $v['default_bus'], implode('", "', array_keys($v['buses'])))); })
13091309
->end()
13101310
->children()
1311+
->arrayNode('stop_signals')
1312+
->fixXmlConfig('stop_signal')
1313+
->beforeNormalization()
1314+
->ifString()
1315+
->then(static fn (string $value): int => constant($value))
1316+
->castToArray()
1317+
->end()
1318+
->validate()
1319+
->ifTrue(static fn ($v): bool => !function_exists('pcntl_signal'))
1320+
->then(static 8000 function (): void { throw new InvalidConfigurationException('You must install pcntl extension in order to use stop_signals.'); })
1321+
->ifNull()
1322+
->then(static function (): void { throw new InvalidConfigurationException('Invalid signal passed to stop_signals'); })
1323+
->end()
1324+
->end()
13111325
->arrayNode('routing')
13121326
->normalizeKeys(false)
13131327
->useAttributeAsKey('message_class')

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -706,9 +706,9 @@ private function registerHttpCacheConfiguration(array $config, ContainerBuilder
706706

707707
if ($httpMethodOverride) {
708708
$container->getDefinition('http_cache')
709-
->addArgument((new Definition('void'))
710-
->setFactory([Request::class, 'enableHttpMethodParameterOverride'])
711-
);
709+
->addArgument((new Definition('void'))
710+
->setFactory([Request::class, 'enableHttpMethodParameterOverride'])
711+
);
712712
}
713713
}
714714

@@ -1914,6 +1914,8 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
19141914
$config['default_bus'] = key($config['buses']);
19151915
}
19161916

1917+
$container->getDefinition('stop_worker_on_sigterm_signal_listener')->setArgument('$signals', $config['stop_signals']);
1918+
19171919
$defaultMiddleware = [
19181920
'before' => [
19191921
['id' => 'add_bus_name_stamp_middleware'],

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

Lines changed: 3 additions & 1 deletion
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\StopWorkerOnSignalListener;
2627
use Symfony\Component\Messenger\EventListener\StopWorkerOnSigtermSignalListener;
2728
use Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware;
2829
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
@@ -192,8 +193,9 @@
192193
->tag('kernel.event_subscriber')
193194
->tag('monolog.logger', ['channel' => 'messenger'])
194195

195-
->set('messenger.listener.stop_worker_on_sigterm_signal_listener', StopWorkerOnSigtermSignalListener::class)
196+
->set('messenger.listener.stop_worker_on_signal_listener', StopWorkerOnSignalListener::class)
196197
->args([
198+
abstract_arg('signals'),
197199
service('logger')->ignoreOnInvalid(),
198200
])
199201
->tag('kernel.event_subscriber')

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,106 @@ public function testLockMergeConfigs()
265265
);
266266
}
267267

268+
public function testMessengerWithoutPcntl()
269+
{
270+
$processor = new Processor();
271+
$configuration = new Configuration(true);
272+
273+
$config = $processor->processConfiguration($configuration, [
274+
'framework' => [
275+
'messenger' => [
276+
],
277+
],
278+
]);
279+
280+
self::assertEquals([\SIGTERM], $config['framework']['messenger']['stop_signals']);
281+
}
282+
283+
public function testMessengerWithPcntlWithoutExplicitlyConfigured()
284+
{
285+
$this->expectException(InvalidConfigurationException::class);
286+
$this->expectExceptionMessage('You must install pcntl extension in order to use stop_signals.');
287+
$processor = new Processor();
288+
$configuration = new Configuration(true);
289+
290+
$processor->processConfiguration($configuration, [
291+
'framework' => [
292+
'messenger' => [
293+
'stop_signals' => \SIGTERM
294+
],
295+
],
296+
]);
297+
}
298+
299+
public function testMessengerWithoutPcntlWithoutStopSignals()
300+
{
301+
$processor = new Processor();
302+
$configuration = new Configuration(true);
303+
304+
$processor->processConfiguration($configuration, [
305+
'framework' => [
306+
'messenger' => [
307+
],
308+
],
309+
]);
310+
311+
$this->expectNotToPerformAssertions();
312+
}
313+
314+
public function testMessengerWithInvalidSignal()
315+
{
316+
$this->expectException(InvalidConfigurationException::class);
317+
$this->expectExceptionMessage('Invalid signal passed to stop_signals');
318+
$processor = new Processor();
319+
$configuration = new Configuration(true);
320+
321+
$processor->processConfiguration($configuration, [
322+
'framework' => [
323+
'messenger' => [
324+
'stop_signals' => \SIG_IGN
325+
],
326+
],
327+
]);
328+
}
329+
330+
public function testMessengerWithMultipleStopSignals()
331+
{
332+
$processor = new Processor();
333+
$configuration = new Configuration(true);
334+
335+
$config = $processor->processConfiguration($configuration, [
336+
'framework' => [
337+
'messenger' => [
338+
'stop_signals' => [\SIGTERM, \SIGQUIT]
339+
],
340+
],
341+
]);
342+
343+
static::assertEquals(
344+
[\SIGTERM, \SIGQUIT],
345+
$config['messenger']['stop_signals']
346+
);
347+
}
348+
349+
public function testMessengerWithStringStopSignal()
350+
{
351+
$processor = new Processor();
352+
$configuration = new Configuration(true);
353+
354+
$config = $processor->processConfiguration($configuration, [
355+
'framework' => [
356+
'messenger' => [
357+
'stop_signals' => ['SIGTERM', 'SIGQUIT']
358+
],
359+
],
360+
]);
361+
362+
static::assertEquals(
363+
[\SIGTERM, \SIGQUIT],
364+
$config['messenger']['stop_signals']
365+
);
366+
}
367+
268368
public function testItShowANiceMessageIfTwoMessengerBusesAreConfiguredButNoDefaultBus()
269369
{
270370
$expectedMessage = 'You must specify the "default_bus" if you define more than one bus.';

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage;
55

66
$container->loadFromExtension('framework', [
7+
'stop_signals'=> \SIGTERM,
78
'messenger' => [
89
'routing' => [
910
FooMessage::class => ['sender.bar', 'sender.biz'],

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
framework:
22
messenger:
3+
stop_signals: SIGTERM
34
routing:
45
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': ['sender.bar', 'sender.biz']
56
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage': 'sender.foo'

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

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,15 @@
1212
namespace Symfony\Component\Messenger\EventListener;
1313

1414
use Psr\Log\LoggerInterface;
15-
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16-
use Symfony\Component\Messenger\Event\WorkerStartedEvent;
1715

1816
/**
1917
* @author Tobias Schultze <http://tobion.de>
18+
* @deprecated Use StopWorkerOnSignalListener instead.
2019
*/
21-
class StopWorkerOnSigtermSignalListener implements EventSubscriberInterface
20+
class StopWorkerOnSigtermSignalListener extends StopWorkerOnSignalListener
2221
{
23-
private ?LoggerInterface $logger;
24-
2522
public function __construct(LoggerInterface $logger = null)
2623
{
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_nam 9293 es' => $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-
];
24+
parent::__construct(\SIGTERM, $logger);
4825
}
4926
}

0 commit comments

Comments
 (0)
0