diff --git a/src/Symfony/Component/Messenger/Event/SendMessageToTransportsEvent.php b/src/Symfony/Component/Messenger/Event/SendMessageToTransportsEvent.php index a54622e83cf99..e0f3a07137aa5 100644 --- a/src/Symfony/Component/Messenger/Event/SendMessageToTransportsEvent.php +++ b/src/Symfony/Component/Messenger/Event/SendMessageToTransportsEvent.php @@ -20,6 +20,8 @@ * The event is *only* dispatched if the message will actually * be sent to at least one transport. If the message is sent * to multiple transports, the message is dispatched only one time. + * This message is only dispatched the first time a message + * is sent to a transport, not also if it is retried. * * @author Ryan Weaver */ diff --git a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php index e389da910cbf9..b4b50f9e892d3 100644 --- a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php @@ -62,20 +62,21 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope /** @var RedeliveryStamp|null $redeliveryStamp */ $redeliveryStamp = $envelope->last(RedeliveryStamp::class); - $senders = \iterator_to_array($this->sendersLocator->getSenders($envelope, $handle)); - - if (null !== $this->eventDispatcher && \count($senders) > 0) { - $event = new SendMessageToTransportsEvent($envelope); - $this->eventDispatcher->dispatch($event); - $envelope = $event->getEnvelope(); - } - - foreach ($senders as $alias => $sender) { + // dispatch event unless this is a redelivery + $shouldDispatchEvent = null === $redeliveryStamp; + foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) { // on redelivery, only deliver to the given sender if (null !== $redeliveryStamp && !$redeliveryStamp->shouldRedeliverToSender(\get_class($sender), $alias)) { continue; } + if (null !== $this->eventDispatcher && $shouldDispatchEvent) { + $event = new SendMessageToTransportsEvent($envelope); + $this->eventDispatcher->dispatch($event); + $envelope = $event->getEnvelope(); + $shouldDispatchEvent = false; + } + $this->logger->info('Sending message "{class}" with "{sender}"', $context + ['sender' => \get_class($sender)]); $envelope = $sender->send($envelope->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null))); } diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php index 8237838a3a0b5..0a23a0dbba5c3 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php @@ -205,7 +205,7 @@ public function testItSkipsReceivedMessages() $this->assertNull($envelope->last(SentStamp::class), 'it does not add sent stamp for received messages'); } - public function testItDispatchesTheEventOnceTime() + public function testItDispatchesTheEventOneTime() { $envelope = new Envelope(new DummyMessage('original envelope')); @@ -224,4 +224,31 @@ public function testItDispatchesTheEventOnceTime() $middleware->handle($envelope, $this->getStackMock(false)); } + + public function testItDoesNotDispatchWithNoSenders() + { + $envelope = new Envelope(new DummyMessage('original envelope')); + + $dispatcher = $this->createMock(EventDispatcherInterface::class); + $dispatcher->expects($this->never())->method('dispatch'); + + $middleware = new SendMessageMiddleware(new SendersLocator([]), $dispatcher); + + $middleware->handle($envelope, $this->getStackMock()); + } + + public function testItDoesNotDispatchOnRetry() + { + $envelope = new Envelope(new DummyMessage('original envelope')); + $envelope = $envelope->with(new RedeliveryStamp(3, 'foo_sender')); + + $dispatcher = $this->createMock(EventDispatcherInterface::class); + $dispatcher->expects($this->never())->method('dispatch'); + + $sender = $this->getMockBuilder(SenderInterface::class)->getMock(); + + $middleware = new SendMessageMiddleware(new SendersLocator([DummyMessage::class => [$sender]]), $dispatcher); + + $middleware->handle($envelope, $this->getStackMock(false)); + } } 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