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

Skip to content

Commit 67af93f

Browse files
committed
bug #32053 [Messenger] No need for retry to require SentStamp (Tobion)
This PR was merged into the 4.3 branch. Discussion ---------- [Messenger] No need for retry to require SentStamp | Q | A | ------------- | --- | Branch? | 4.3 | Bug fix? | yes | New feature? | no <!-- please update src/**/CHANGELOG.md files --> | BC breaks? | no <!-- see https://symfony.com/bc --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tests pass? | yes <!-- please add some, will be required by reviewers --> | Fixed tickets | | License | MIT | Doc PR | Fixes 2) in #32049 @weaverryan the SentStamp in the worker seems totally irrelevant. You always want to send messages back to the transport where they came from for retry. The only relevance I can potentially see is for the SyncTransport. Messages received async from worker might be routed to the SyncTransport. Using the SentStamp would redeliver the messages into the SyncTransport instead of the async. But that doesn't seem to have any use-case. I'm running the worker which handles the messages immediately. So basically there is no difference if they go to the Sync or Async transport from within the worker. Commits ------- 0034dee [Messenger] make retry logic work without SentStamp
2 parents 6986011 + 0034dee commit 67af93f

File tree

3 files changed

+11
-35
lines changed

3 files changed

+11
-35
lines changed

src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public function testRetryMechanism()
3434
$senderAndReceiver = new DummySenderAndReceiver();
3535

3636
$senderLocator = $this->createMock(ContainerInterface::class);
37-
$senderLocator->method('has')->with('sender_alias')->willReturn(true);
38-
$senderLocator->method('get')->with('sender_alias')->willReturn($senderAndReceiver);
39-
$senderLocator = new SendersLocator([DummyMessage::class => ['sender_alias']], $senderLocator);
37+
$senderLocator->method('has')->with('transportName')->willReturn(true);
38+
$senderLocator->method('get')->with('transportName')->willReturn($senderAndReceiver);
39+
$senderLocator = new SendersLocator([DummyMessage::class => ['transportName']], $senderLocator);
4040

4141
$handler = new DummyMessageHandlerFailingFirstTimes(0);
4242
$throwingHandler = new DummyMessageHandlerFailingFirstTimes(1);
@@ -52,7 +52,7 @@ public function testRetryMechanism()
5252
$envelope = new Envelope(new DummyMessage('API'));
5353
$bus->dispatch($envelope);
5454

55-
$worker = new Worker(['receiverName' => $senderAndReceiver], $bus, ['receiverName' => new MultiplierRetryStrategy()]);
55+
$worker = new Worker(['transportName' => $senderAndReceiver], $bus, ['transportName' => new MultiplierRetryStrategy()]);
5656
$worker->run([], function (?Envelope $envelope) use ($worker) {
5757
if (null === $envelope) {
5858
$worker->stop();

src/Symfony/Component/Messenger/Tests/WorkerTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public function testWorkerDoesNotWrapMessagesAlreadyWrappedWithReceivedMessage()
8484
public function testDispatchCausesRetry()
8585
{
8686
$receiver = new DummyReceiver([
87-
[new Envelope(new DummyMessage('Hello'), [new SentStamp('Some\Sender', 'sender_alias')])],
87+
[new Envelope(new DummyMessage('Hello'), [new SentStamp('Some\Sender', 'transport1')])],
8888
]);
8989

9090
$bus = $this->getMockBuilder(MessageBusInterface::class)->getMock();
@@ -97,7 +97,7 @@ public function testDispatchCausesRetry()
9797
$this->assertNotNull($redeliveryStamp);
9898
// retry count now at 1
9999
$this->assertSame(1, $redeliveryStamp->getRetryCount());
100-
$this->assertSame('sender_alias', $redeliveryStamp->getSenderClassOrAlias());
100+
$this->assertSame('transport1', $redeliveryStamp->getSenderClassOrAlias());
101101

102102
// received stamp is removed
103103
$this->assertNull($envelope->last(ReceivedStamp::class));
@@ -108,7 +108,7 @@ public function testDispatchCausesRetry()
108108
$retryStrategy = $this->getMockBuilder(RetryStrategyInterface::class)->getMock();
109109
$retryStrategy->expects($this->once())->method('isRetryable')->willReturn(true);
110110

111-
$worker = new Worker(['receiver1' => $receiver], $bus, ['receiver1' => $retryStrategy]);
111+
$worker = new Worker(['transport1' => $receiver], $bus, ['transport1' => $retryStrategy]);
112112
$worker->run([], function (?Envelope $envelope) use ($worker) {
113113
// stop after the messages finish
114114
if (null === $envelope) {
@@ -123,7 +123,7 @@ public function testDispatchCausesRetry()
123123
public function testDispatchCausesRejectWhenNoRetry()
124124
{
125125
$receiver = new DummyReceiver([
126-
[new Envelope(new DummyMessage('Hello'), [new SentStamp('Some\Sender', 'sender_alias')])],
126+
[new Envelope(new DummyMessage('Hello'), [new SentStamp('Some\Sender', 'transport1')])],
127127
]);
128128

129129
$bus = $this->getMockBuilder(MessageBusInterface::class)->getMock();
@@ -132,7 +132,7 @@ public function testDispatchCausesRejectWhenNoRetry()
132132
$retryStrategy = $this->getMockBuilder(RetryStrategyInterface::class)->getMock();
133133
$retryStrategy->expects($this->once())->method('isRetryable')->willReturn(false);
134134

135-
$worker = new Worker(['receiver1' => $receiver], $bus, ['receiver1' => $retryStrategy]);
135+
$worker = new Worker(['transport1' => $receiver], $bus, ['transport1' => $retryStrategy]);
136136
$worker->run([], function (?Envelope $envelope) use ($worker) {
137137
// stop after the messages finish
138138
if (null === $envelope) {
@@ -155,7 +155,7 @@ public function testDispatchCausesRejectOnUnrecoverableMessage()
155155
$retryStrategy = $this->getMockBuilder(RetryStrategyInterface::class)->getMock();
156156
$retryStrategy->expects($this->never())->method('isRetryable');
157157

158-
$worker = new Worker(['receiver1' => $receiver], $bus, ['receiver1' => $retryStrategy]);
158+
$worker = new Worker(['transport1' => $receiver], $bus, ['transport1' => $retryStrategy]);
159159
$worker->run([], function (?Envelope $envelope) use ($worker) {
160160
// stop after the messages finish
161161
if (null === $envelope) {

src/Symfony/Component/Messenger/Worker.php

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@
1717
use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
1818
use Symfony\Component\Messenger\Event\WorkerStoppedEvent;
1919
use Symfony\Component\Messenger\Exception\HandlerFailedException;
20-
use Symfony\Component\Messenger\Exception\LogicException;
2120
use Symfony\Component\Messenger\Exception\UnrecoverableMessageHandlingException;
2221
use Symfony\Component\Messenger\Retry\RetryStrategyInterface;
2322
use Symfony\Component\Messenger\Stamp\DelayStamp;
2423
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
2524
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
26-
use Symfony\Component\Messenger\Stamp\SentStamp;
2725
use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface;
2826
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
2927

@@ -150,7 +148,7 @@ private function handleMessage(Envelope $envelope, ReceiverInterface $receiver,
150148

151149
// add the delay and retry stamp info + remove ReceivedStamp
152150
$retryEnvelope = $envelope->with(new DelayStamp($delay))
153-
->with(new RedeliveryStamp($retryCount, $this->getSenderClassOrAlias($envelope)))
151+
->with(new RedeliveryStamp($retryCount, $transportName))
154152
->withoutAll(ReceivedStamp::class);
155153

156154
// re-send the message
@@ -197,28 +195,6 @@ private function shouldRetry(\Throwable $e, Envelope $envelope, RetryStrategyInt
197195
return false;
198196
}
199197

200-
$sentStamp = $envelope->last(SentStamp::class);
201-
if (null === $sentStamp) {
202-
if (null !== $this->logger) {
203-
$this->logger->warning('Message will not be retried because the SentStamp is missing and so the target sender cannot be determined.');
204-
}
205-
206-
return false;
207-
}
208-
209198
return $retryStrategy->isRetryable($envelope);
210199
}
211-
212-
private function getSenderClassOrAlias(Envelope $envelope): string
213-
{
214-
/** @var SentStamp|null $sentStamp */
215-
$sentStamp = $envelope->last(SentStamp::class);
216-
217-
if (null === $sentStamp) {
218-
// should not happen, because of the check in shouldRetry()
219-
throw new LogicException('Could not find SentStamp.');
220-
}
221-
222-
return $sentStamp->getSenderAlias() ?: $sentStamp->getSenderClass();
223-
}
224200
}

0 commit comments

Comments
 (0)