[Messenger] Show exceptions on after empty fails

This commit is contained in:
Timo Bakx 2019-07-03 15:24:14 +02:00
parent 0470ac33e8
commit 598bd92313
3 changed files with 55 additions and 10 deletions

View File

@ -62,8 +62,7 @@ abstract class AbstractFailedMessagesCommand extends Command
/** @var SentToFailureTransportStamp|null $sentToFailureTransportStamp */ /** @var SentToFailureTransportStamp|null $sentToFailureTransportStamp */
$sentToFailureTransportStamp = $envelope->last(SentToFailureTransportStamp::class); $sentToFailureTransportStamp = $envelope->last(SentToFailureTransportStamp::class);
/** @var RedeliveryStamp|null $lastRedeliveryStamp */ $lastRedeliveryStampWithException = $this->getLastRedeliveryStampWithException($envelope);
$lastRedeliveryStamp = $envelope->last(RedeliveryStamp::class);
$rows = [ $rows = [
['Class', \get_class($envelope->getMessage())], ['Class', \get_class($envelope->getMessage())],
@ -73,13 +72,13 @@ abstract class AbstractFailedMessagesCommand extends Command
$rows[] = ['Message Id', $id]; $rows[] = ['Message Id', $id];
} }
$flattenException = null === $lastRedeliveryStamp ? null : $lastRedeliveryStamp->getFlattenException(); $flattenException = null === $lastRedeliveryStampWithException ? null : $lastRedeliveryStampWithException->getFlattenException();
if (null === $sentToFailureTransportStamp) { if (null === $sentToFailureTransportStamp) {
$io->warning('Message does not appear to have been sent to this transport after failing'); $io->warning('Message does not appear to have been sent to this transport after failing');
} else { } else {
$rows = array_merge($rows, [ $rows = array_merge($rows, [
['Failed at', null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s')], ['Failed at', null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getRedeliveredAt()->format('Y-m-d H:i:s')],
['Error', null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getExceptionMessage()], ['Error', null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getExceptionMessage()],
['Error Class', null === $flattenException ? '(unknown)' : $flattenException->getClass()], ['Error Class', null === $flattenException ? '(unknown)' : $flattenException->getClass()],
['Transport', $sentToFailureTransportStamp->getOriginalReceiverName()], ['Transport', $sentToFailureTransportStamp->getOriginalReceiverName()],
]); ]);
@ -121,4 +120,16 @@ abstract class AbstractFailedMessagesCommand extends Command
{ {
return $this->receiver; return $this->receiver;
} }
protected function getLastRedeliveryStampWithException(Envelope $envelope): ?RedeliveryStamp
{
/** @var RedeliveryStamp $stamp */
foreach (array_reverse($envelope->all(RedeliveryStamp::class)) as $stamp) {
if (null !== $stamp->getExceptionMessage()) {
return $stamp;
}
}
return null;
}
} }

View File

@ -18,7 +18,6 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
use Symfony\Component\Messenger\Transport\Receiver\ListableReceiverInterface; use Symfony\Component\Messenger\Transport\Receiver\ListableReceiverInterface;
/** /**
@ -83,14 +82,13 @@ EOF
$rows = []; $rows = [];
foreach ($envelopes as $envelope) { foreach ($envelopes as $envelope) {
/** @var RedeliveryStamp|null $lastRedeliveryStamp */ $lastRedeliveryStampWithException = $this->getLastRedeliveryStampWithException($envelope);
$lastRedeliveryStamp = $envelope->last(RedeliveryStamp::class);
$rows[] = [ $rows[] = [
$this->getMessageId($envelope), $this->getMessageId($envelope),
\get_class($envelope->getMessage()), \get_class($envelope->getMessage()),
null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s'), null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getRedeliveredAt()->format('Y-m-d H:i:s'),
null === $lastRedeliveryStamp ? '' : $lastRedeliveryStamp->getExceptionMessage(), null === $lastRedeliveryStampWithException ? '' : $lastRedeliveryStampWithException->getExceptionMessage(),
]; ];
} }

View File

@ -58,4 +58,40 @@ EOF
$redeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s')), $redeliveryStamp->getRedeliveredAt()->format('Y-m-d H:i:s')),
$tester->getDisplay(true)); $tester->getDisplay(true));
} }
public function testMultipleRedeliveryFails()
{
$sentToFailureStamp = new SentToFailureTransportStamp('async');
$redeliveryStamp1 = new RedeliveryStamp(0, 'failure_receiver', 'Things are bad!');
$redeliveryStamp2 = new RedeliveryStamp(0, 'failure_receiver');
$envelope = new Envelope(new \stdClass(), [
new TransportMessageIdStamp(15),
$sentToFailureStamp,
$redeliveryStamp1,
$redeliveryStamp2,
]);
$receiver = $this->createMock(ListableReceiverInterface::class);
$receiver->expects($this->once())->method('find')->with(15)->willReturn($envelope);
$command = new FailedMessagesShowCommand(
'failure_receiver',
$receiver
);
$tester = new CommandTester($command);
$tester->execute(['id' => 15]);
$this->assertStringContainsString(sprintf(<<<EOF
------------- ---------------------
Class stdClass
Message Id 15
Failed at %s
Error Things are bad!
Error Class (unknown)
Transport async
EOF
,
$redeliveryStamp2->getRedeliveredAt()->format('Y-m-d H:i:s')),
$tester->getDisplay(true));
}
} }