From 9b4cc57f28600c8495a1213431f0b8882e8a25b8 Mon Sep 17 00:00:00 2001 From: "j.apsitis" Date: Mon, 26 Feb 2024 08:22:46 +0200 Subject: [PATCH] [Messenger] Passing to `WorkerMessageRetriedEvent` envelope with actual stamps after sent Signed-off-by: j.apsitis --- .../SendFailedMessageForRetryListener.php | 2 +- .../SendFailedMessageForRetryListenerTest.php | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php index e87aaeff8a4f..ca4791d8d6a3 100644 --- a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php +++ b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php @@ -77,7 +77,7 @@ public function onMessageFailed(WorkerMessageFailedEvent $event) $retryEnvelope = $this->withLimitedHistory($envelope, new DelayStamp($delay), new RedeliveryStamp($retryCount)); // re-send the message for retry - $this->getSenderForTransport($event->getReceiverName())->send($retryEnvelope); + $retryEnvelope = $this->getSenderForTransport($event->getReceiverName())->send($retryEnvelope); if (null !== $this->eventDispatcher) { $this->eventDispatcher->dispatch(new WorkerMessageRetriedEvent($retryEnvelope, $event->getReceiverName())); diff --git a/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php b/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php index a5fe10e85578..0519a19fb661 100644 --- a/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php +++ b/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php @@ -13,13 +13,16 @@ use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; +use Symfony\Component\DependencyInjection\Container; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; +use Symfony\Component\Messenger\Event\WorkerMessageRetriedEvent; use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener; use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException; use Symfony\Component\Messenger\Retry\RetryStrategyInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; use Symfony\Component\Messenger\Stamp\RedeliveryStamp; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Sender\SenderInterface; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; @@ -190,4 +193,47 @@ public function testEnvelopeKeepOnlyTheLast10Stamps() $listener->onMessageFailed($event); } + + public function testRetriedEnvelopePassesToRetriedEvent() + { + $exception = new \Exception('no!'); + $envelope = new Envelope(new \stdClass()); + + $sender = $this->createMock(SenderInterface::class); + $sender->expects($this->once())->method('send')->willReturnCallback(static function (Envelope $envelope) { + return $envelope->with(new TransportMessageIdStamp(123)); + }); + + $eventDispatcher = $this->createMock(EventDispatcherInterface::class); + $eventDispatcher->expects($this->once())->method('dispatch')->willReturnCallback( + function (WorkerMessageRetriedEvent $retriedEvent) { + $envelope = $retriedEvent->getEnvelope(); + + $transportIdStamp = $envelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportIdStamp); + + return $retriedEvent; + }); + + $senderLocator = new Container(); + $senderLocator->set('my_receiver', $sender); + + $retryStrategy = $this->createMock(RetryStrategyInterface::class); + $retryStrategy->expects($this->once())->method('isRetryable')->willReturn(true); + $retryStrategy->expects($this->once())->method('getWaitingTime')->willReturn(1000); + + $retryStrategyLocator = new Container(); + $retryStrategyLocator->set('my_receiver', $retryStrategy); + + $listener = new SendFailedMessageForRetryListener( + $senderLocator, + $retryStrategyLocator, + null, + $eventDispatcher + ); + + $event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception); + + $listener->onMessageFailed($event); + } } 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