diff --git a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php index e87aaeff8a4fe..ca4791d8d6a3a 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 a5fe10e85578b..0519a19fb6619 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); + } }
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: