From 4a3edd0b37d92fca72ced11f11f251dd50e299ae Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Wed, 17 Oct 2018 17:45:44 +0200 Subject: [PATCH] [Messenger] internal cleanups --- .../Middleware/SendMessageMiddleware.php | 10 ++---- .../Routing/AbstractSenderLocator.php | 27 ++++++++------- .../Routing/ContainerSenderLocator.php | 5 +-- .../Asynchronous/Routing/SenderLocator.php | 7 ++-- .../Routing/SenderLocatorInterface.php | 7 ++-- src/Symfony/Component/Messenger/CHANGELOG.md | 6 ++++ .../DataCollector/MessengerDataCollector.php | 30 ++++++++--------- src/Symfony/Component/Messenger/Envelope.php | 3 ++ .../Messenger/Handler/ChainHandler.php | 2 +- .../Locator/AbstractHandlerLocator.php | 19 ++++++----- .../Locator/ContainerHandlerLocator.php | 4 +-- .../Handler/Locator/HandlerLocator.php | 4 +-- .../Locator/HandlerLocatorInterface.php | 9 ++--- .../Middleware/HandleMessageMiddleware.php | 12 +++---- .../Middleware/LoggingMiddleware.php | 22 +++++-------- .../Middleware/SendMessageMiddlewareTest.php | 2 +- .../Routing/ContainerSenderLocatorTest.php | 17 +++++----- .../Routing/SenderLocatorTest.php | 7 ++-- .../MessengerDataCollectorTest.php | 10 +++--- .../Locator/ContainerHandlerLocatorTest.php | 13 ++++---- .../Tests/TraceableMessageBusTest.php | 4 +-- ...StopWhenTimeLimitIsReachedReceiverTest.php | 3 +- .../Messenger/TraceableMessageBus.php | 33 +++++++------------ .../Transport/AmqpExt/AmqpSender.php | 2 +- .../StopWhenTimeLimitIsReachedReceiver.php | 9 ++--- .../Messenger/Transport/SenderInterface.php | 4 +-- 26 files changed, 131 insertions(+), 140 deletions(-) diff --git a/src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php b/src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php index 6e342b00d2db..3bfdc3760f1c 100644 --- a/src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Asynchronous/Middleware/SendMessageMiddleware.php @@ -44,21 +44,17 @@ public function handle(Envelope $envelope, callable $next): void return; } - $sender = $this->senderLocator->getSenderForMessage($envelope->getMessage()); + $sender = $this->senderLocator->getSender($envelope); if ($sender) { $sender->send($envelope); - if (!$this->mustSendAndHandle($envelope->getMessage())) { + if (!AbstractSenderLocator::getValueFromMessageRouting($this->messagesToSendAndHandleMapping, $envelope)) { + // message has no corresponding handler return; } } $next($envelope); } - - private function mustSendAndHandle($message): bool - { - return (bool) AbstractSenderLocator::getValueFromMessageRouting($this->messagesToSendAndHandleMapping, $message); - } } diff --git a/src/Symfony/Component/Messenger/Asynchronous/Routing/AbstractSenderLocator.php b/src/Symfony/Component/Messenger/Asynchronous/Routing/AbstractSenderLocator.php index eafdd1de9f00..da823a4259b5 100644 --- a/src/Symfony/Component/Messenger/Asynchronous/Routing/AbstractSenderLocator.php +++ b/src/Symfony/Component/Messenger/Asynchronous/Routing/AbstractSenderLocator.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Messenger\Asynchronous\Routing; +use Symfony\Component\Messenger\Envelope; + /** * @author Samuel Roze * @@ -18,21 +20,24 @@ */ abstract class AbstractSenderLocator implements SenderLocatorInterface { - public static function getValueFromMessageRouting(array $mapping, $message) + public static function getValueFromMessageRouting(array $mapping, Envelope $envelope) { - if (isset($mapping[\get_class($message)])) { - return $mapping[\get_class($message)]; - } - if ($parentsMapping = array_intersect_key($mapping, class_parents($message))) { - return current($parentsMapping); + if (isset($mapping[$class = \get_class($envelope->getMessage())])) { + return $mapping[$class]; } - if ($interfaceMapping = array_intersect_key($mapping, class_implements($message))) { - return current($interfaceMapping); + + foreach (class_parents($class) as $name) { + if (isset($mapping[$name])) { + return $mapping[$name]; + } } - if (isset($mapping['*'])) { - return $mapping['*']; + + foreach (class_implements($class) as $name) { + if (isset($mapping[$name])) { + return $mapping[$name]; + } } - return null; + return $mapping['*'] ?? null; } } diff --git a/src/Symfony/Component/Messenger/Asynchronous/Routing/ContainerSenderLocator.php b/src/Symfony/Component/Messenger/Asynchronous/Routing/ContainerSenderLocator.php index ef338bd5066b..17113e472032 100644 --- a/src/Symfony/Component/Messenger/Asynchronous/Routing/ContainerSenderLocator.php +++ b/src/Symfony/Component/Messenger/Asynchronous/Routing/ContainerSenderLocator.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Asynchronous\Routing; use Psr\Container\ContainerInterface; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Transport\SenderInterface; /** @@ -31,9 +32,9 @@ public function __construct(ContainerInterface $senderServiceLocator, array $mes /** * {@inheritdoc} */ - public function getSenderForMessage($message): ?SenderInterface + public function getSender(Envelope $envelope): ?SenderInterface { - $senderId = self::getValueFromMessageRouting($this->messageToSenderIdMapping, $message); + $senderId = self::getValueFromMessageRouting($this->messageToSenderIdMapping, $envelope); return $senderId ? $this->senderServiceLocator->get($senderId) : null; } diff --git a/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php b/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php index 8c8b6b8a75a2..c6c93636967c 100644 --- a/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php +++ b/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocator.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Messenger\Asynchronous\Routing; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\RuntimeException; use Symfony\Component\Messenger\Transport\SenderInterface; @@ -29,15 +30,15 @@ public function __construct(array $messageToSenderMapping) /** * {@inheritdoc} */ - public function getSenderForMessage($message): ?SenderInterface + public function getSender(Envelope $envelope): ?SenderInterface { - $sender = self::getValueFromMessageRouting($this->messageToSenderMapping, $message); + $sender = self::getValueFromMessageRouting($this->messageToSenderMapping, $envelope); if (null === $sender) { return null; } if (!$sender instanceof SenderInterface) { - throw new RuntimeException(sprintf('The sender instance provided for message "%s" should be of type "%s" but got "%s".', \get_class($message), SenderInterface::class, \is_object($sender) ? \get_class($sender) : \gettype($sender))); + throw new RuntimeException(sprintf('The sender instance provided for message "%s" should be of type "%s" but got "%s".', \get_class($envelope->getMessage()), SenderInterface::class, \is_object($sender) ? \get_class($sender) : \gettype($sender))); } return $sender; diff --git a/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocatorInterface.php b/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocatorInterface.php index 4380ab9962d4..d532ee8789da 100644 --- a/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocatorInterface.php +++ b/src/Symfony/Component/Messenger/Asynchronous/Routing/SenderLocatorInterface.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Messenger\Asynchronous\Routing; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Transport\SenderInterface; /** @@ -21,10 +22,6 @@ interface SenderLocatorInterface { /** * Gets the sender (if applicable) for the given message object. - * - * @param object $message - * - * @return SenderInterface|null */ - public function getSenderForMessage($message): ?SenderInterface; + public function getSender(Envelope $envelope): ?SenderInterface; } diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 9444d4166f4a..50e220efed4d 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -27,6 +27,12 @@ CHANGELOG * `Envelope`'s constructor and `with()` method now accept `StampInterface` objects as variadic parameters * Renamed and moved `ReceivedMessage`, `ValidationConfiguration` and `SerializerConfiguration` in the `Stamp` namespace * Removed the `WrapIntoReceivedMessage` + * `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)` + * `MessengerDataCollector::getMessages()` returns an iterable, not just an array anymore + * `AbstractHandlerLocator` is now internal + * `HandlerLocatorInterface::resolve()` has been replaced by `getHandler(Envelope $envelope)` + * `SenderLocatorInterface::getSenderForMessage()` has been replaced by `getSender(Envelope $envelope)` + * `SenderInterface::send()` returns `void` 4.1.0 ----- diff --git a/src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php b/src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php index 77415c5c2879..9f6fe828ec03 100644 --- a/src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php +++ b/src/Symfony/Component/Messenger/DataCollector/MessengerDataCollector.php @@ -17,7 +17,6 @@ use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; use Symfony\Component\Messenger\TraceableMessageBus; use Symfony\Component\VarDumper\Caster\ClassStub; -use Symfony\Component\VarDumper\Cloner\Data; /** * @author Samuel Roze @@ -55,14 +54,10 @@ public function lateCollect() } // Order by call time - usort($messages, function (array $a, array $b): int { - return $a[1] > $b[1] ? 1 : -1; - }); + usort($messages, function ($a, $b) { return $a[1] <=> $b[1]; }); // Keep the messages clones only - $this->data['messages'] = array_map(function (array $item): Data { - return $item[0]; - }, $messages); + $this->data['messages'] = array_column($messages, 0); } /** @@ -112,18 +107,21 @@ private function collectMessage(string $busName, array $tracedMessage) public function getExceptionsCount(string $bus = null): int { - return array_reduce($this->getMessages($bus), function (int $carry, Data $message) { - return $carry += isset($message['exception']) ? 1 : 0; - }, 0); + $count = 0; + foreach ($this->getMessages($bus) as $message) { + $count += (int) isset($message['exception']); + } + + return $count; } - public function getMessages(string $bus = null): array + public function getMessages(string $bus = null): iterable { - $messages = $this->data['messages'] ?? array(); - - return $bus ? array_filter($messages, function (Data $message) use ($bus): bool { - return $bus === $message['bus']; - }) : $messages; + foreach ($this->data['messages'] ?? array() as $message) { + if (null === $bus || $bus === $message['bus']) { + yield $message; + } + } } public function getBuses(): array diff --git a/src/Symfony/Component/Messenger/Envelope.php b/src/Symfony/Component/Messenger/Envelope.php index 9026b6b7f98f..6441eb7d5dbe 100644 --- a/src/Symfony/Component/Messenger/Envelope.php +++ b/src/Symfony/Component/Messenger/Envelope.php @@ -28,6 +28,9 @@ final class Envelope */ public function __construct($message, StampInterface ...$stamps) { + if (!\is_object($message)) { + throw new \TypeError(sprintf('Invalid argument provided to "%s()": expected object but got %s.', __METHOD__, \gettype($message))); + } $this->message = $message; foreach ($stamps as $stamp) { diff --git a/src/Symfony/Component/Messenger/Handler/ChainHandler.php b/src/Symfony/Component/Messenger/Handler/ChainHandler.php index 79cf3a4682de..5c3ac4b8d62b 100644 --- a/src/Symfony/Component/Messenger/Handler/ChainHandler.php +++ b/src/Symfony/Component/Messenger/Handler/ChainHandler.php @@ -30,7 +30,7 @@ class ChainHandler */ public function __construct(array $handlers) { - if (empty($handlers)) { + if (!$handlers) { throw new InvalidArgumentException('A collection of message handlers requires at least one handler.'); } diff --git a/src/Symfony/Component/Messenger/Handler/Locator/AbstractHandlerLocator.php b/src/Symfony/Component/Messenger/Handler/Locator/AbstractHandlerLocator.php index 6fecd1bd67cb..5a16f6fe6b04 100644 --- a/src/Symfony/Component/Messenger/Handler/Locator/AbstractHandlerLocator.php +++ b/src/Symfony/Component/Messenger/Handler/Locator/AbstractHandlerLocator.php @@ -11,30 +11,33 @@ namespace Symfony\Component\Messenger\Handler\Locator; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\NoHandlerForMessageException; /** * @author Miha Vrhovnik * @author Samuel Roze + * + * @internal */ abstract class AbstractHandlerLocator implements HandlerLocatorInterface { - public function resolve($message): callable + public function getHandler(Envelope $envelope): callable { - $class = \get_class($message); + $class = \get_class($envelope->getMessage()); - if ($handler = $this->getHandler($class)) { + if ($handler = $this->getHandlerByName($class)) { return $handler; } - foreach (class_implements($class, false) as $interface) { - if ($handler = $this->getHandler($interface)) { + foreach (class_parents($class) as $name) { + if ($handler = $this->getHandlerByName($name)) { return $handler; } } - foreach (class_parents($class, false) as $parent) { - if ($handler = $this->getHandler($parent)) { + foreach (class_implements($class) as $name) { + if ($handler = $this->getHandlerByName($name)) { return $handler; } } @@ -42,5 +45,5 @@ public function resolve($message): callable throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $class)); } - abstract protected function getHandler(string $class): ?callable; + abstract protected function getHandlerByName(string $name): ?callable; } diff --git a/src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php b/src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php index e9bc7ff5e69e..0e1837f896ab 100644 --- a/src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php +++ b/src/Symfony/Component/Messenger/Handler/Locator/ContainerHandlerLocator.php @@ -29,8 +29,8 @@ public function __construct(ContainerInterface $container) /** * {@inheritdoc} */ - protected function getHandler(string $class): ?callable + protected function getHandlerByName(string $name): ?callable { - return $this->container->has($class) ? $this->container->get($class) : null; + return $this->container->has($name) ? $this->container->get($name) : null; } } diff --git a/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocator.php b/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocator.php index ea6d0e2b419b..4042ca682bcb 100644 --- a/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocator.php +++ b/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocator.php @@ -29,8 +29,8 @@ public function __construct(array $messageToHandlerMapping = array()) /** * {@inheritdoc} */ - protected function getHandler(string $class): ?callable + protected function getHandlerByName(string $name): ?callable { - return $this->messageToHandlerMapping[$class] ?? null; + return $this->messageToHandlerMapping[$name] ?? null; } } diff --git a/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocatorInterface.php b/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocatorInterface.php index 131c3ce623d8..9a040b07a404 100644 --- a/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocatorInterface.php +++ b/src/Symfony/Component/Messenger/Handler/Locator/HandlerLocatorInterface.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Messenger\Handler\Locator; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\NoHandlerForMessageException; /** @@ -21,11 +22,7 @@ interface HandlerLocatorInterface /** * Returns the handler for the given message. * - * @param object $message - * - * @throws NoHandlerForMessageException - * - * @return callable + * @throws NoHandlerForMessageException When no handler is found */ - public function resolve($message): callable; + public function getHandler(Envelope $envelope): callable; } diff --git a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php index a73d37e863dc..0c6a759b63d5 100644 --- a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php @@ -19,11 +19,11 @@ */ class HandleMessageMiddleware implements MiddlewareInterface { - private $messageHandlerResolver; + private $messageHandlerLocator; - public function __construct(HandlerLocatorInterface $messageHandlerResolver) + public function __construct(HandlerLocatorInterface $messageHandlerLocator) { - $this->messageHandlerResolver = $messageHandlerResolver; + $this->messageHandlerLocator = $messageHandlerLocator; } /** @@ -31,10 +31,8 @@ public function __construct(HandlerLocatorInterface $messageHandlerResolver) */ public function handle(Envelope $envelope, callable $next): void { - $message = $envelope->getMessage(); - $handler = $this->messageHandlerResolver->resolve($message); - $handler($message); - + $handler = $this->messageHandlerLocator->getHandler($envelope); + $handler($envelope->getMessage()); $next($envelope); } } diff --git a/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php b/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php index 25cfe43b3807..758e160a2b6f 100644 --- a/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/LoggingMiddleware.php @@ -32,27 +32,21 @@ public function __construct(LoggerInterface $logger) public function handle(Envelope $envelope, callable $next): void { $message = $envelope->getMessage(); - $this->logger->debug('Starting handling message {class}', $this->createContext($message)); + $context = array( + 'message' => $message, + 'name' => \get_class($message), + ); + $this->logger->debug('Starting handling message {name}', $context); try { $next($envelope); } catch (\Throwable $e) { - $this->logger->warning('An exception occurred while handling message {class}', array_merge( - $this->createContext($message), - array('exception' => $e) - )); + $context['exception'] = $e; + $this->logger->warning('An exception occurred while handling message {name}', $context); throw $e; } - $this->logger->debug('Finished handling message {class}', $this->createContext($message)); - } - - private function createContext($message): array - { - return array( - 'message' => $message, - 'class' => \get_class($message), - ); + $this->logger->debug('Finished handling message {name}', $context); } } diff --git a/src/Symfony/Component/Messenger/Tests/Asynchronous/Middleware/SendMessageMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Asynchronous/Middleware/SendMessageMiddlewareTest.php index e45d227f271f..522daae0f908 100644 --- a/src/Symfony/Component/Messenger/Tests/Asynchronous/Middleware/SendMessageMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Asynchronous/Middleware/SendMessageMiddlewareTest.php @@ -158,7 +158,7 @@ public function __construct(?SenderInterface $sender) $this->sender = $sender; } - public function getSenderForMessage($message): ?SenderInterface + public function getSender(Envelope $envelope): ?SenderInterface { return $this->sender; } diff --git a/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/ContainerSenderLocatorTest.php b/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/ContainerSenderLocatorTest.php index 29eac0f05617..df8df34e0dff 100644 --- a/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/ContainerSenderLocatorTest.php +++ b/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/ContainerSenderLocatorTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\Messenger\Asynchronous\Routing\ContainerSenderLocator; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Tests\Fixtures\ChildDummyMessage; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessageInterface; @@ -32,8 +33,8 @@ public function testItReturnsTheSenderBasedOnTheMessageClass() DummyMessage::class => 'my_amqp_sender', )); - $this->assertSame($sender, $locator->getSenderForMessage(new DummyMessage('Hello'))); - $this->assertNull($locator->getSenderForMessage(new SecondMessage())); + $this->assertSame($sender, $locator->getSender(new Envelope(new DummyMessage('Hello')))); + $this->assertNull($locator->getSender(new Envelope(new SecondMessage()))); } public function testItReturnsTheSenderBasedOnTheMessageParentClass() @@ -51,8 +52,8 @@ public function testItReturnsTheSenderBasedOnTheMessageParentClass() DummyMessage::class => 'my_amqp_sender', )); - $this->assertSame($sender, $locator->getSenderForMessage(new ChildDummyMessage('Hello'))); - $this->assertNull($locator->getSenderForMessage(new SecondMessage())); + $this->assertSame($sender, $locator->getSender(new Envelope(new ChildDummyMessage('Hello')))); + $this->assertNull($locator->getSender(new Envelope(new SecondMessage()))); } public function testItReturnsTheSenderBasedOnTheMessageInterface() @@ -66,8 +67,8 @@ public function testItReturnsTheSenderBasedOnTheMessageInterface() DummyMessageInterface::class => 'my_amqp_sender', )); - $this->assertSame($sender, $locator->getSenderForMessage(new DummyMessage('Hello'))); - $this->assertNull($locator->getSenderForMessage(new SecondMessage())); + $this->assertSame($sender, $locator->getSender(new Envelope(new DummyMessage('Hello')))); + $this->assertNull($locator->getSender(new Envelope(new SecondMessage()))); } public function testItSupportsAWildcardInsteadOfTheMessageClass() @@ -85,7 +86,7 @@ public function testItSupportsAWildcardInsteadOfTheMessageClass() '*' => 'my_api_sender', )); - $this->assertSame($sender, $locator->getSenderForMessage(new DummyMessage('Hello'))); - $this->assertSame($apiSender, $locator->getSenderForMessage(new SecondMessage())); + $this->assertSame($sender, $locator->getSender(new Envelope(new DummyMessage('Hello')))); + $this->assertSame($apiSender, $locator->getSender(new Envelope(new SecondMessage()))); } } diff --git a/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php b/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php index f39a31617a7a..436d6021b28c 100644 --- a/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php +++ b/src/Symfony/Component/Messenger/Tests/Asynchronous/Routing/SenderLocatorTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Messenger\Asynchronous\Routing\SenderLocator; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\RuntimeException; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; use Symfony\Component\Messenger\Tests\Fixtures\SecondMessage; @@ -27,8 +28,8 @@ public function testItReturnsTheSenderBasedOnTheMessageClass() DummyMessage::class => $sender, )); - $this->assertSame($sender, $locator->getSenderForMessage(new DummyMessage('Hello'))); - $this->assertNull($locator->getSenderForMessage(new SecondMessage())); + $this->assertSame($sender, $locator->getSender(new Envelope(new DummyMessage('Hello')))); + $this->assertNull($locator->getSender(new Envelope(new SecondMessage()))); } public function testItThrowsExceptionIfConfigurationIsWrong() @@ -38,6 +39,6 @@ public function testItThrowsExceptionIfConfigurationIsWrong() )); $this->expectException(RuntimeException::class); - $locator->getSenderForMessage(new DummyMessage('Hello')); + $locator->getSender(new Envelope(new DummyMessage('Hello'))); } } diff --git a/src/Symfony/Component/Messenger/Tests/DataCollector/MessengerDataCollectorTest.php b/src/Symfony/Component/Messenger/Tests/DataCollector/MessengerDataCollectorTest.php index 71278b02da93..79beab93f88d 100644 --- a/src/Symfony/Component/Messenger/Tests/DataCollector/MessengerDataCollectorTest.php +++ b/src/Symfony/Component/Messenger/Tests/DataCollector/MessengerDataCollectorTest.php @@ -48,14 +48,14 @@ public function testHandle() $collector->lateCollect(); - $messages = $collector->getMessages(); + $messages = iterator_to_array($collector->getMessages()); $this->assertCount(1, $messages); $file = __FILE__; $expected = << "default" - "stamps" => null + "stamps" => [] "message" => array:2 [ "type" => "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage" "value" => Symfony\Component\Messenger\Tests\Fixtures\DummyMessage %A @@ -93,14 +93,14 @@ public function testHandleWithException() $collector->lateCollect(); - $messages = $collector->getMessages(); + $messages = iterator_to_array($collector->getMessages()); $this->assertCount(1, $messages); $file = __FILE__; $this->assertStringMatchesFormat(<< "default" - "stamps" => null + "stamps" => [] "message" => array:2 [ "type" => "Symfony\Component\Messenger\Tests\Fixtures\DummyMessage" "value" => Symfony\Component\Messenger\Tests\Fixtures\DummyMessage %A @@ -141,7 +141,7 @@ public function testKeepsOrderedDispatchCalls() $collector->lateCollect(); - $messages = $collector->getMessages(); + $messages = iterator_to_array($collector->getMessages()); $this->assertCount(5, $messages); $this->assertSame('#1', $messages[0]['message']['value']['message']); diff --git a/src/Symfony/Component/Messenger/Tests/Handler/Locator/ContainerHandlerLocatorTest.php b/src/Symfony/Component/Messenger/Tests/Handler/Locator/ContainerHandlerLocatorTest.php index 40eee2bd7e6a..98680c329bc0 100644 --- a/src/Symfony/Component/Messenger/Tests/Handler/Locator/ContainerHandlerLocatorTest.php +++ b/src/Symfony/Component/Messenger/Tests/Handler/Locator/ContainerHandlerLocatorTest.php @@ -4,6 +4,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Handler\Locator\ContainerHandlerLocator; use Symfony\Component\Messenger\Tests\Fixtures\ChildDummyMessage; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; @@ -19,7 +20,7 @@ public function testItLocatesHandlerUsingTheMessageClass() $container->set(DummyMessage::class, $handler); $locator = new ContainerHandlerLocator($container); - $resolvedHandler = $locator->resolve(new DummyMessage('Hey')); + $resolvedHandler = $locator->getHandler(new Envelope(new DummyMessage('Hey'))); $this->assertSame($handler, $resolvedHandler); } @@ -31,10 +32,10 @@ public function testItLocatesHandlerUsingTheMessageClass() public function testThrowsNoHandlerException() { $locator = new ContainerHandlerLocator(new Container()); - $locator->resolve(new DummyMessage('Hey')); + $locator->getHandler(new Envelope(new DummyMessage('Hey'))); } - public function testResolveMessageViaTheirInterface() + public function testGetHandlerViaInterface() { $handler = function () {}; @@ -42,12 +43,12 @@ public function testResolveMessageViaTheirInterface() $container->set(DummyMessageInterface::class, $handler); $locator = new ContainerHandlerLocator($container); - $resolvedHandler = $locator->resolve(new DummyMessage('Hey')); + $resolvedHandler = $locator->getHandler(new Envelope(new DummyMessage('Hey'))); $this->assertSame($handler, $resolvedHandler); } - public function testResolveMessageViaTheirParentClass() + public function testGetHandlerViaParentClass() { $handler = function () {}; @@ -55,7 +56,7 @@ public function testResolveMessageViaTheirParentClass() $container->set(DummyMessage::class, $handler); $locator = new ContainerHandlerLocator($container); - $resolvedHandler = $locator->resolve(new ChildDummyMessage('Hey')); + $resolvedHandler = $locator->getHandler(new Envelope(new ChildDummyMessage('Hey'))); $this->assertSame($handler, $resolvedHandler); } diff --git a/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php b/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php index d43fe8aa3726..36299d29c93a 100644 --- a/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php +++ b/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php @@ -32,7 +32,7 @@ public function testItTracesDispatch() $this->assertCount(1, $tracedMessages = $traceableBus->getDispatchedMessages()); $this->assertArraySubset(array( 'message' => $message, - 'stamps' => null, + 'stamps' => array(), 'caller' => array( 'name' => 'TraceableMessageBusTest.php', 'file' => __FILE__, @@ -83,7 +83,7 @@ public function testItTracesExceptions() $this->assertArraySubset(array( 'message' => $message, 'exception' => $exception, - 'stamps' => null, + 'stamps' => array(), 'caller' => array( 'name' => 'TraceableMessageBusTest.php', 'file' => __FILE__, diff --git a/src/Symfony/Component/Messenger/Tests/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiverTest.php b/src/Symfony/Component/Messenger/Tests/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiverTest.php index 51119b36f56a..295e9a48a1ee 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiverTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiverTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Tests\Fixtures\CallbackReceiver; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; use Symfony\Component\Messenger\Transport\Enhancers\StopWhenTimeLimitIsReachedReceiver; @@ -25,7 +26,7 @@ class StopWhenTimeLimitIsReachedReceiverTest extends TestCase public function testReceiverStopsWhenTimeLimitIsReached() { $callable = function ($handler) { - $handler(new DummyMessage('API')); + $handler(new Envelope(new DummyMessage('API'))); }; $decoratedReceiver = $this->getMockBuilder(CallbackReceiver::class) diff --git a/src/Symfony/Component/Messenger/TraceableMessageBus.php b/src/Symfony/Component/Messenger/TraceableMessageBus.php index 68d9d5eb0c24..741339052a7c 100644 --- a/src/Symfony/Component/Messenger/TraceableMessageBus.php +++ b/src/Symfony/Component/Messenger/TraceableMessageBus.php @@ -29,30 +29,22 @@ public function __construct(MessageBusInterface $decoratedBus) */ public function dispatch($message): void { - $caller = $this->getCaller(); - $callTime = microtime(true); - $messageToTrace = $message instanceof Envelope ? $message->getMessage() : $message; - $stamps = $message instanceof Envelope ? array_values($message->all()) : null; + $envelope = $message instanceof Envelope ? $message : new Envelope($message); + $context = array( + 'stamps' => array_values($envelope->all()), + 'message' => $envelope->getMessage(), + 'caller' => $this->getCaller(), + 'callTime' => microtime(true), + ); try { $this->decoratedBus->dispatch($message); - - $this->dispatchedMessages[] = array( - 'stamps' => $stamps, - 'message' => $messageToTrace, - 'callTime' => $callTime, - 'caller' => $caller, - ); } catch (\Throwable $e) { - $this->dispatchedMessages[] = array( - 'stamps' => $stamps, - 'message' => $messageToTrace, - 'exception' => $e, - 'callTime' => $callTime, - 'caller' => $caller, - ); + $context['exception'] = $e; throw $e; + } finally { + $this->dispatchedMessages[] = $context; } } @@ -82,10 +74,7 @@ private function getCaller(): array $line = $trace[$i]['line']; while (++$i < 8) { - if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos( - $trace[$i]['function'], - 'call_user_func' - )) { + if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos($trace[$i]['function'], 'call_user_func')) { $file = $trace[$i]['file']; $line = $trace[$i]['line']; diff --git a/src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpSender.php b/src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpSender.php index bb084a8f03ae..b66af383e5b0 100644 --- a/src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpSender.php +++ b/src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpSender.php @@ -35,7 +35,7 @@ public function __construct(Connection $connection, SerializerInterface $seriali /** * {@inheritdoc} */ - public function send(Envelope $envelope) + public function send(Envelope $envelope): void { $encodedMessage = $this->serializer->encode($envelope); diff --git a/src/Symfony/Component/Messenger/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiver.php b/src/Symfony/Component/Messenger/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiver.php index b88a0cbd046c..1ede7b2a3141 100644 --- a/src/Symfony/Component/Messenger/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiver.php +++ b/src/Symfony/Component/Messenger/Transport/Enhancers/StopWhenTimeLimitIsReachedReceiver.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Transport\Enhancers; use Psr\Log\LoggerInterface; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Transport\ReceiverInterface; /** @@ -32,13 +33,13 @@ public function __construct(ReceiverInterface $decoratedReceiver, int $timeLimit public function receive(callable $handler): void { - $startTime = time(); + $startTime = microtime(true); $endTime = $startTime + $this->timeLimitInSeconds; - $this->decoratedReceiver->receive(function ($message) use ($handler, $endTime) { - $handler($message); + $this->decoratedReceiver->receive(function (?Envelope $envelope) use ($handler, $endTime) { + $handler($envelope); - if ($endTime < time()) { + if ($endTime < microtime(true)) { $this->stop(); if (null !== $this->logger) { $this->logger->info('Receiver stopped due to time limit of {timeLimit}s reached', array('timeLimit' => $this->timeLimitInSeconds)); diff --git a/src/Symfony/Component/Messenger/Transport/SenderInterface.php b/src/Symfony/Component/Messenger/Transport/SenderInterface.php index a400420ac064..0e0e62ec6ba6 100644 --- a/src/Symfony/Component/Messenger/Transport/SenderInterface.php +++ b/src/Symfony/Component/Messenger/Transport/SenderInterface.php @@ -20,8 +20,6 @@ interface SenderInterface { /** * Sends the given envelope. - * - * @param Envelope $envelope */ - public function send(Envelope $envelope); + public function send(Envelope $envelope): void; }