From f432bc83f1f4845961406b5afe2f36b1354781ce Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Sat, 8 Feb 2025 15:39:35 +0100 Subject: [PATCH] the DeduplicateMiddleware requires the lock feature to be enabled If the `lock` feature is not enabled, no `lock.factory` service will be registered. --- .../FrameworkExtension.php | 6 +- ...iple_buses_with_deduplicate_middleware.php | 27 +++++ ..._buses_without_deduplicate_middleware.php} | 0 ...iple_buses_with_deduplicate_middleware.xml | 29 +++++ ..._buses_without_deduplicate_middleware.xml} | 0 ...iple_buses_with_deduplicate_middleware.yml | 19 ++++ ..._buses_without_deduplicate_middleware.yml} | 0 .../FrameworkExtensionTestCase.php | 103 ++++++++++-------- .../Middleware/DeduplicateMiddleware.php | 2 +- .../Middleware/DeduplicateMiddlewareTest.php | 2 +- 10 files changed, 138 insertions(+), 50 deletions(-) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_with_deduplicate_middleware.php rename src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/{messenger_multiple_buses.php => messenger_multiple_buses_without_deduplicate_middleware.php} (100%) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_with_deduplicate_middleware.xml rename src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/{messenger_multiple_buses.xml => messenger_multiple_buses_without_deduplicate_middleware.xml} (100%) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_with_deduplicate_middleware.yml rename src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/{messenger_multiple_buses.yml => messenger_multiple_buses_without_deduplicate_middleware.yml} (100%) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 10d7037440c93..96bd5924b9744 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -538,7 +538,7 @@ public function load(array $configs, ContainerBuilder $container): void // messenger depends on validation being registered if ($messengerEnabled) { - $this->registerMessengerConfiguration($config['messenger'], $container, $loader, $this->readConfigEnabled('validation', $container, $config['validation'])); + $this->registerMessengerConfiguration($config['messenger'], $container, $loader, $this->readConfigEnabled('validation', $container, $config['validation']), $this->readConfigEnabled('lock', $container, $config['lock'])); } else { $container->removeDefinition('console.command.messenger_consume_messages'); $container->removeDefinition('console.command.messenger_stats'); @@ -2228,7 +2228,7 @@ private function registerSchedulerConfiguration(ContainerBuilder $container, Php } } - private function registerMessengerConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader, bool $validationEnabled): void + private function registerMessengerConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader, bool $validationEnabled, bool $lockEnabled): void { if (!interface_exists(MessageBusInterface::class)) { throw new LogicException('Messenger support cannot be enabled as the Messenger component is not installed. Try running "composer require symfony/messenger".'); @@ -2284,7 +2284,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder ], ]; - if (class_exists(DeduplicateMiddleware::class) && class_exists(LockFactory::class)) { + if ($lockEnabled && class_exists(DeduplicateMiddleware::class) && class_exists(LockFactory::class)) { $defaultMiddleware['before'][] = ['id' => 'deduplicate_middleware']; } else { $container->removeDefinition('messenger.middleware.deduplicate_middleware'); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_with_deduplicate_middleware.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_with_deduplicate_middleware.php new file mode 100644 index 0000000000000..f9b3767c0fc7b --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_with_deduplicate_middleware.php @@ -0,0 +1,27 @@ +loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'lock' => null, + 'messenger' => [ + 'default_bus' => 'messenger.bus.commands', + 'buses' => [ + 'messenger.bus.commands' => null, + 'messenger.bus.events' => [ + 'middleware' => [ + ['with_factory' => ['foo', true, ['bar' => 'baz']]], + ], + ], + 'messenger.bus.queries' => [ + 'default_middleware' => false, + 'middleware' => [ + 'send_message', + 'handle_message', + ], + ], + ], + ], +]); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_without_deduplicate_middleware.php similarity index 100% rename from src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses.php rename to src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_multiple_buses_without_deduplicate_middleware.php diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_with_deduplicate_middleware.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_with_deduplicate_middleware.xml new file mode 100644 index 0000000000000..67decad203092 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_with_deduplicate_middleware.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + foo + true + + baz + + + + + + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_without_deduplicate_middleware.xml similarity index 100% rename from src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses.xml rename to src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_multiple_buses_without_deduplicate_middleware.xml diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_with_deduplicate_middleware.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_with_deduplicate_middleware.yml new file mode 100644 index 0000000000000..ed52564c7264d --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_with_deduplicate_middleware.yml @@ -0,0 +1,19 @@ +framework: + annotations: false + http_method_override: false + handle_all_throwables: true + php_errors: + log: true + lock: ~ + messenger: + default_bus: messenger.bus.commands + buses: + messenger.bus.commands: ~ + messenger.bus.events: + middleware: + - with_factory: [foo, true, { bar: baz }] + messenger.bus.queries: + default_middleware: false + middleware: + - "send_message" + - "handle_message" diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_without_deduplicate_middleware.yml similarity index 100% rename from src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses.yml rename to src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_multiple_buses_without_deduplicate_middleware.yml diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php index 2535707f5ef58..a50070858608a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php @@ -1056,60 +1056,73 @@ public function testMessengerTransportConfiguration() $this->assertSame(['enable_max_depth' => true], $serializerTransportDefinition->getArgument(2)); } - public function testMessengerWithMultipleBuses() + public function testMessengerWithMultipleBusesWithoutDeduplicateMiddleware() { - $container = $this->createContainerFromFile('messenger_multiple_buses'); + $container = $this->createContainerFromFile('messenger_multiple_buses_without_deduplicate_middleware'); $this->assertTrue($container->has('messenger.bus.commands')); $this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0)); - - if (class_exists(DeduplicateMiddleware::class)) { - $this->assertEquals([ - ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']], - ['id' => 'reject_redelivered_message_middleware'], - ['id' => 'dispatch_after_current_bus'], - ['id' => 'failed_message_processing_middleware'], - ['id' => 'deduplicate_middleware'], - ['id' => 'send_message', 'arguments' => [true]], - ['id' => 'handle_message', 'arguments' => [false]], - ], $container->getParameter('messenger.bus.commands.middleware')); - } else { - $this->assertEquals([ - ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']], - ['id' => 'reject_redelivered_message_middleware'], - ['id' => 'dispatch_after_current_bus'], - ['id' => 'failed_message_processing_middleware'], - ['id' => 'send_message', 'arguments' => [true]], - ['id' => 'handle_message', 'arguments' => [false]], - ], $container->getParameter('messenger.bus.commands.middleware')); - } - + $this->assertEquals([ + ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']], + ['id' => 'reject_redelivered_message_middleware'], + ['id' => 'dispatch_after_current_bus'], + ['id' => 'failed_message_processing_middleware'], + ['id' => 'send_message', 'arguments' => [true]], + ['id' => 'handle_message', 'arguments' => [false]], + ], $container->getParameter('messenger.bus.commands.middleware')); $this->assertTrue($container->has('messenger.bus.events')); $this->assertSame([], $container->getDefinition('messenger.bus.events')->getArgument(0)); + $this->assertEquals([ + ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']], + ['id' => 'reject_redelivered_message_middleware'], + ['id' => 'dispatch_after_current_bus'], + ['id' => 'failed_message_processing_middleware'], + ['id' => 'with_factory', 'arguments' => ['foo', true, ['bar' => 'baz']]], + ['id' => 'send_message', 'arguments' => [true]], + ['id' => 'handle_message', 'arguments' => [false]], + ], $container->getParameter('messenger.bus.events.middleware')); + $this->assertTrue($container->has('messenger.bus.queries')); + $this->assertSame([], $container->getDefinition('messenger.bus.queries')->getArgument(0)); + $this->assertEquals([ + ['id' => 'send_message', 'arguments' => []], + ['id' => 'handle_message', 'arguments' => []], + ], $container->getParameter('messenger.bus.queries.middleware')); - if (class_exists(DeduplicateMiddleware::class)) { - $this->assertEquals([ - ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']], - ['id' => 'reject_redelivered_message_middleware'], - ['id' => 'dispatch_after_current_bus'], - ['id' => 'failed_message_processing_middleware'], - ['id' => 'deduplicate_middleware'], - ['id' => 'with_factory', 'arguments' => ['foo', true, ['bar' => 'baz']]], - ['id' => 'send_message', 'arguments' => [true]], - ['id' => 'handle_message', 'arguments' => [false]], - ], $container->getParameter('messenger.bus.events.middleware')); - } else { - $this->assertEquals([ - ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']], - ['id' => 'reject_redelivered_message_middleware'], - ['id' => 'dispatch_after_current_bus'], - ['id' => 'failed_message_processing_middleware'], - ['id' => 'with_factory', 'arguments' => ['foo', true, ['bar' => 'baz']]], - ['id' => 'send_message', 'arguments' => [true]], - ['id' => 'handle_message', 'arguments' => [false]], - ], $container->getParameter('messenger.bus.events.middleware')); + $this->assertTrue($container->hasAlias('messenger.default_bus')); + $this->assertSame('messenger.bus.commands', (string) $container->getAlias('messenger.default_bus')); + } + + public function testMessengerWithMultipleBusesWithDeduplicateMiddleware() + { + if (!class_exists(DeduplicateMiddleware::class)) { + $this->markTestSkipped('DeduplicateMiddleware not available.'); } + $container = $this->createContainerFromFile('messenger_multiple_buses_with_deduplicate_middleware'); + + $this->assertTrue($container->has('messenger.bus.commands')); + $this->assertSame([], $container->getDefinition('messenger.bus.commands')->getArgument(0)); + $this->assertEquals([ + ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.commands']], + ['id' => 'reject_redelivered_message_middleware'], + ['id' => 'dispatch_after_current_bus'], + ['id' => 'failed_message_processing_middleware'], + ['id' => 'deduplicate_middleware'], + ['id' => 'send_message', 'arguments' => [true]], + ['id' => 'handle_message', 'arguments' => [false]], + ], $container->getParameter('messenger.bus.commands.middleware')); + $this->assertTrue($container->has('messenger.bus.events')); + $this->assertSame([], $container->getDefinition('messenger.bus.events')->getArgument(0)); + $this->assertEquals([ + ['id' => 'add_bus_name_stamp_middleware', 'arguments' => ['messenger.bus.events']], + ['id' => 'reject_redelivered_message_middleware'], + ['id' => 'dispatch_after_current_bus'], + ['id' => 'failed_message_processing_middleware'], + ['id' => 'deduplicate_middleware'], + ['id' => 'with_factory', 'arguments' => ['foo', true, ['bar' => 'baz']]], + ['id' => 'send_message', 'arguments' => [true]], + ['id' => 'handle_message', 'arguments' => [false]], + ], $container->getParameter('messenger.bus.events.middleware')); $this->assertTrue($container->has('messenger.bus.queries')); $this->assertSame([], $container->getDefinition('messenger.bus.queries')->getArgument(0)); $this->assertEquals([ diff --git a/src/Symfony/Component/Messenger/Middleware/DeduplicateMiddleware.php b/src/Symfony/Component/Messenger/Middleware/DeduplicateMiddleware.php index c252153b92a41..0c459047b5c3c 100644 --- a/src/Symfony/Component/Messenger/Middleware/DeduplicateMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/DeduplicateMiddleware.php @@ -29,7 +29,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope } if (!$envelope->last(ReceivedStamp::class)) { - $lock = $this->lockFactory->createLockFromKey($stamp->getKey(), $stamp->getTtl(), autoRelease: false); + $lock = $this->lockFactory->createLockFromKey($stamp->getKey(), $stamp->getTtl(), false); if (!$lock->acquire()) { return $envelope; diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/DeduplicateMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/DeduplicateMiddlewareTest.php index 50a302406a7ab..804d67fcb4067 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/DeduplicateMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/DeduplicateMiddlewareTest.php @@ -29,7 +29,7 @@ public function testDeduplicateMiddlewareIgnoreIfMessageIsNotLockable() $envelope = new Envelope($message); $lockFactory = $this->createMock(LockFactory::class); - $lockFactory->expects($this->never())->method('createLock'); + $lockFactory->expects($this->never())->method('createLockFromKey'); $decorator = new DeduplicateMiddleware($lockFactory);