Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2ad804f

Browse files
committed
bug #54057 [Messenger] Passing actual Envelope to WorkerMessageRetriedEvent (daffoxdev)
This PR was merged into the 5.4 branch. Discussion ---------- [Messenger] Passing actual `Envelope` to `WorkerMessageRetriedEvent` | Q | A | ------------- | --- | Branch? |5.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix #52914 | License | MIT In `SendFailedMessageForRetryListener` fixed the `Envelope` instance that passes to `WorkerMessageRetriedEvent`. Now it is instance of `Envelope` the that is returned by transport sender and could include such stamps as `TransportMessageIdStamp`. Previously to the event passed the not actual envelope that is created before passed to `send()` - changes in SendFailedMessageForRetryListener - added new test for this case in `SendFailedMessageForRetryListenerTest` Commits ------- 9b4cc57 [Messenger] Passing to `WorkerMessageRetriedEvent` envelope with actual stamps after sent
2 parents cdd7595 + 9b4cc57 commit 2ad804f

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public function onMessageFailed(WorkerMessageFailedEvent $event)
7777
$retryEnvelope = $this->withLimitedHistory($envelope, new DelayStamp($delay), new RedeliveryStamp($retryCount));
7878

7979
// re-send the message for retry
80-
$this->getSenderForTransport($event->getReceiverName())->send($retryEnvelope);
80+
$retryEnvelope = $this->getSenderForTransport($event->getReceiverName())->send($retryEnvelope);
8181

8282
if (null !== $this->eventDispatcher) {
8383
$this->eventDispatcher->dispatch(new WorkerMessageRetriedEvent($retryEnvelope, $event->getReceiverName()));

src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Psr\Container\ContainerInterface;
16+
use Symfony\Component\DependencyInjection\Container;
1617
use Symfony\Component\Messenger\Envelope;
1718
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
19+
use Symfony\Component\Messenger\Event\WorkerMessageRetriedEvent;
1820
use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener;
1921
use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException;
2022
use Symfony\Component\Messenger\Retry\RetryStrategyInterface;
2123
use Symfony\Component\Messenger\Stamp\DelayStamp;
2224
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
25+
use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp;
2326
use Symfony\Component\Messenger\Transport\Sender\SenderInterface;
2427
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
2528

@@ -190,4 +193,47 @@ public function testEnvelopeKeepOnlyTheLast10Stamps()
190193

191194
$listener->onMessageFailed($event);
192195
}
196+
197+
public function testRetriedEnvelopePassesToRetriedEvent()
198+
{
199+
$exception = new \Exception('no!');
200+
$envelope = new Envelope(new \stdClass());
201+
202+
$sender = $this->createMock(SenderInterface::class);
203+
$sender->expects($this->once())->method('send')->willReturnCallback(static function (Envelope $envelope) {
204+
return $envelope->with(new TransportMessageIdStamp(123));
205+
});
206+
207+
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
208+
$eventDispatcher->expects($this->once())->method('dispatch')->willReturnCallback(
209+
function (WorkerMessageRetriedEvent $retriedEvent) {
210+
$envelope = $retriedEvent->getEnvelope();
211+
212+
$transportIdStamp = $envelope->last(TransportMessageIdStamp::class);
213+
$this->assertNotNull($transportIdStamp);
214+
215+
return $retriedEvent;
216+
});
217+
218+
$senderLocator = new Container();
219+
$senderLocator->set('my_receiver', $sender);
220+
221+
$retryStrategy = $this->createMock(RetryStrategyInterface::class);
222+
$retryStrategy->expects($this->once())->method('isRetryable')->willReturn(true);
223+
$retryStrategy->expects($this->once())->method('getWaitingTime')->willReturn(1000);
224+
225+
$retryStrategyLocator = new Container();
226+
$retryStrategyLocator->set('my_receiver', $retryStrategy);
227+
228+
$listener = new SendFailedMessageForRetryListener(
229+
$senderLocator,
230+
$retryStrategyLocator,
231+
null,
232+
$eventDispatcher
233+
);
234+
235+
$event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception);
236+
237+
$listener->onMessageFailed($event);
238+
}
193239
}

0 commit comments

Comments
 (0)