diff --git a/src/DependencyInjection/AmqpExtension.php b/src/DependencyInjection/AmqpExtension.php index 694045d..41efcaa 100644 --- a/src/DependencyInjection/AmqpExtension.php +++ b/src/DependencyInjection/AmqpExtension.php @@ -340,6 +340,7 @@ private function configureExchanges(ContainerBuilder $container, array $exchange $exchangeFactoryServiceId = \sprintf('fivelab.amqp.exchange_factory.%s', $key); $exchangeFactoryServiceDef = new Definition(ExchangeFactoryInterface::class); $exchangeFactoryServiceDef->setFactory([new Reference($this->driverFactories[$exchange['connection']]), 'createExchangeFactory']); + $exchangeFactoryServiceDef->setArguments([ new Reference($this->defaultChannelFactories[$exchange['connection']]), new Reference($exchangeDefinitionServiceId), @@ -496,6 +497,7 @@ private function configureQueues(ContainerBuilder $container, array $queues, arr $queueFactoryServiceId = \sprintf('fivelab.amqp.queue_factory.%s', $key); $queueFactoryServiceDef = new Definition(QueueFactoryInterface::class); $queueFactoryServiceDef->setFactory([new Reference($this->driverFactories[$queue['connection']]), 'createQueueFactory']); + $queueFactoryServiceDef->setArguments([ new Reference($this->defaultChannelFactories[$queue['connection']]), new Reference($queueDefinitionServiceId), diff --git a/src/Middleware/ReleaseMemoryMiddleware.php b/src/Middleware/ReleaseMemoryMiddleware.php new file mode 100644 index 0000000..ce699c0 --- /dev/null +++ b/src/Middleware/ReleaseMemoryMiddleware.php @@ -0,0 +1,38 @@ +clearBeforeHandle) { + $this->resetMemory(); + } + + try { + $next($message); + } finally { + if (false === $this->clearBeforeHandle) { + $this->resetMemory(); + } + } + } + + private function resetMemory(): void + { + $this->servicesResetter->reset(); + + \gc_collect_cycles(); + } +} diff --git a/tests/DependencyInjection/AmqpExtensionConfigureConsumersTest.php b/tests/DependencyInjection/AmqpExtensionConfigureConsumersTest.php index 70b6bb2..0da13b0 100644 --- a/tests/DependencyInjection/AmqpExtensionConfigureConsumersTest.php +++ b/tests/DependencyInjection/AmqpExtensionConfigureConsumersTest.php @@ -123,6 +123,7 @@ public function shouldSuccessConfigureSingleConsumer(): void // Verify registry $this->assertContainerBuilderHasService('fivelab.amqp.consumer_registry', ContainerConsumerRegistry::class); + $this->assertContainerBuilderHasServiceDefinitionWithServiceLocatorArgument('fivelab.amqp.consumer_registry', 0, [ 'foo' => 'fivelab.amqp.consumer.foo', ]); @@ -147,6 +148,7 @@ public function shouldSuccessConfigureWithChecker(): void ]); $this->assertContainerBuilderHasService('fivelab.amqp.consumer_checker_registry', ContainerRunConsumerCheckerRegistry::class); + $this->assertContainerBuilderHasServiceDefinitionWithServiceLocatorArgument('fivelab.amqp.consumer_checker_registry', 0, [ 'bla' => 'default_checker', ]); diff --git a/tests/Middleware/ReleaseMemoryMiddlewareTest.php b/tests/Middleware/ReleaseMemoryMiddlewareTest.php new file mode 100644 index 0000000..3d7cb45 --- /dev/null +++ b/tests/Middleware/ReleaseMemoryMiddlewareTest.php @@ -0,0 +1,78 @@ +servicesResetter = $this->createMock(ResetInterface::class); + } + + #[Test] + public function clearMemoryBeforeMessage(): void + { + $alreadyReset = false; + $message = $this->createMock(ReceivedMessage::class); + + $next = function (ReceivedMessage $message) use (&$alreadyReset) { + $this->assertTrue($alreadyReset); + }; + + $this->servicesResetter + ->expects($this->once()) + ->method('reset') + ->willReturnCallback(function () use (&$alreadyReset): void { + $alreadyReset = true; + }); + + $this->getMiddleware(true)->handle($message, $next); + } + + #[Test] + public function clearMemoryOnlyAfterMessage(): void + { + $alreadyReset = false; + $message = $this->createMock(ReceivedMessage::class); + + $next = function (ReceivedMessage $message) use (&$alreadyReset) { + $this->assertFalse($alreadyReset); + }; + + $this->servicesResetter + ->expects($this->once()) + ->method('reset') + ->willReturnCallback(function () use (&$alreadyReset): void { + $alreadyReset = true; + }); + + $this->getMiddleware(false)->handle($message, $next); + } + + private function getMiddleware(bool $clearBeforeMessage): ReleaseMemoryMiddleware + { + return new ReleaseMemoryMiddleware( + $this->servicesResetter, + $clearBeforeMessage + ); + } +}