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

Skip to content

Commit b9f6944

Browse files
committed
bug #32341 [Messenger] Show exceptions after multiple retries (TimoBakx)
This PR was merged into the 4.3 branch. Discussion ---------- [Messenger] Show exceptions after multiple retries | Q | A | ------------- | --- | Branch? | 4.3 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #32311 | License | MIT | Doc PR | n/a After retrying a failed message, the `RedeliveryStamp` looses it's exception information. This PR will remedy that. Commits ------- 598bd92 [Messenger] Show exceptions on after empty fails
2 parents 2e17488 + 598bd92 commit b9f6944

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

src/Symfony/Component/Messenger/Command/AbstractFailedMessagesCommand.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ protected function displaySingleMessage(Envelope $envelope, SymfonyStyle $io)
6262

6363
/** @var SentToFailureTransportStamp|null $sentToFailureTransportStamp */
6464
$sentToFailureTransportStamp = $envelope->last(SentToFailureTransportStamp::class);
65-
/** @var RedeliveryStamp|null $lastRedeliveryStamp */
66-
$lastRedeliveryStamp = $envelope->last(RedeliveryStamp::class);
65+
$lastRedeliveryStampWithException = $this->getLastRedeliveryStampWithException($envelope);
6766

6867
$rows = [
6968
['Class', \get_class($envelope->getMessage())],
@@ -73,13 +72,13 @@ protected function displaySingleMessage(Envelope $envelope, SymfonyStyle $io)
7372
$rows[] = ['Message Id', $id];
7473
}
7574

76-
$flattenException = null === $lastRedeliveryStamp ? null : $lastRedeliveryStamp->getFlattenException();
75+
$flattenException = null === $lastRedeliveryStampWithException ? null : $lastRedeliveryStampWithException->getFlattenException();
7776
if (null === $sentToFailureTransportStamp) {
7877
$io->warning('Message does not appear to have been sent to this transport after failing');
7978
} else {
8079
$rows = array_merge($rows, [
81-
['Failed at', null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s')],
82-
['Error', null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getExceptionMessage()],
80+
['Failed at', null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getRedeliveredAt()->format('Y-m-d H:i:s')],
81+
['Error', null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getExceptionMessage()],
8382
['Error Class', null === $flattenException ? '(unknown)' : $flattenException->getClass()],
8483
['Transport', $sentToFailureTransportStamp->getOriginalReceiverName()],
8584
]);
@@ -121,4 +120,16 @@ protected function getReceiver(): ReceiverInterface
121120
{
122121
return $this->receiver;
123122
}
123+
124+
protected function getLastRedeliveryStampWithException(Envelope $envelope): ?RedeliveryStamp
125+
{
126+
/** @var RedeliveryStamp $stamp */
127+
foreach (array_reverse($envelope->all(RedeliveryStamp::class)) as $stamp) {
128+
if (null !== $stamp->getExceptionMessage()) {
129+
return $stamp;
130+
}
131+
}
132+
133+
return null;
134+
}
124135
}

src/Symfony/Component/Messenger/Command/FailedMessagesShowCommand.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
use Symfony\Component\Console\Output\ConsoleOutputInterface;
1919
use Symfony\Component\Console\Output\OutputInterface;
2020
use Symfony\Component\Console\Style\SymfonyStyle;
21-
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
2221
use Symfony\Component\Messenger\Transport\Receiver\ListableReceiverInterface;
2322

2423
/**
@@ -83,14 +82,13 @@ private function listMessages(SymfonyStyle $io, int $max)
8382

8483
$rows = [];
8584
foreach ($envelopes as $envelope) {
86-
/** @var RedeliveryStamp|null $lastRedeliveryStamp */
87-
$lastRedeliveryStamp = $envelope->last(RedeliveryStamp::class);
85+
$lastRedeliveryStampWithException = $this->getLastRedeliveryStampWithException($envelope);
8886

8987
$rows[] = [
9088
$this->getMessageId($envelope),
9189
\get_class($envelope->getMessage()),
92-
null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s'),
93-
null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getExceptionMessage(),
90+
null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getRedeliveredAt()->format('Y-m-d H:i:s'),
91+
null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getExceptionMessage(),
9492
];
9593
}
9694

src/Symfony/Component/Messenger/Tests/Command/FailedMessagesShowCommandTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,40 @@ public function testBasicRun()
5858
$redeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s')),
5959
$tester->getDisplay(true));
6060
}
61+
62+
public function testMultipleRedeliveryFails()
63+
{
64+
$sentToFailureStamp = new SentToFailureTransportStamp('async');
65+
$redeliveryStamp1 = new RedeliveryStamp(0, 'failure_receiver', 'Things are bad!');
66+
$redeliveryStamp2 = new RedeliveryStamp(0, 'failure_receiver');
67+
$envelope = new Envelope(new \stdClass(), [
68+
new TransportMessageIdStamp(15),
69+
$sentToFailureStamp,
70+
$redeliveryStamp1,
71+
$redeliveryStamp2,
72+
]);
73+
$receiver = $this->createMock(ListableReceiverInterface::class);
74+
$receiver->expects($this->once())->method('find')->with(15)->willReturn($envelope);
75+
76+
$command = new FailedMessagesShowCommand(
77+
'failure_receiver',
78+
$receiver
79+
);
80+
81+
$tester = new CommandTester($command);
82+
$tester->execute(['id' => 15]);
83+
84+
$this->assertStringContainsString(sprintf(<<<EOF
85+
------------- ---------------------
86+
Class stdClass
87+
Message Id 15
88+
Failed at %s
89+
Error Things are bad!
90+
Error Class (unknown)
91+
Transport async
92+
EOF
93+
,
94+
$redeliveryStamp2->getRedeliveredAt()->format('Y-m-d H:i:s')),
95+
$tester->getDisplay(true));
96+
}
6197
}

0 commit comments

Comments
 (0)