Skip to content

Commit a5693f5

Browse files
committed
[Messenger] return empty envelopes when RetryableException occurs
1 parent ccb3a4c commit a5693f5

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

src/Symfony/Component/Messenger/Tests/Transport/Doctrine/DoctrineReceiverTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Messenger\Tests\Transport\Doctrine;
1313

14+
use Doctrine\DBAL\Driver\PDOException;
15+
use Doctrine\DBAL\Exception\DeadlockException;
1416
use PHPUnit\Framework\TestCase;
1517
use Symfony\Component\Messenger\Envelope;
1618
use Symfony\Component\Messenger\Exception\MessageDecodingFailedException;
@@ -68,6 +70,17 @@ public function testItRejectTheMessageIfThereIsAMessageDecodingFailedException()
6870
$receiver->get();
6971
}
7072

73+
public function testOccursRetryableExceptionFromConnection()
74+
{
75+
$serializer = $this->createSerializer();
76+
$connection = $this->createMock(Connection::class);
77+
$driverException = new PDOException(new \PDOException('Deadlock', 40001));
78+
$connection->method('get')->willThrowException(new DeadlockException('Deadlock', $driverException));
79+
$receiver = new DoctrineReceiver($connection, $serializer);
80+
$actualEnvelopes = $receiver->get();
81+
$this->assertSame([], $actualEnvelopes);
82+
}
83+
7184
public function testAll()
7285
{
7386
$serializer = $this->createSerializer();

src/Symfony/Component/Messenger/Transport/Doctrine/DoctrineReceiver.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Messenger\Transport\Doctrine;
1313

1414
use Doctrine\DBAL\DBALException;
15+
use Doctrine\DBAL\Exception\RetryableException;
1516
use Symfony\Component\Messenger\Envelope;
1617
use Symfony\Component\Messenger\Exception\LogicException;
1718
use Symfony\Component\Messenger\Exception\MessageDecodingFailedException;
@@ -46,6 +47,10 @@ public function get(): iterable
4647
{
4748
try {
4849
$doctrineEnvelope = $this->connection->get();
50+
} catch (RetryableException $exception) {
51+
// Do nothing when RetryableException occurs.
52+
// Problem with concurent consumers and Database Deadlocks
53+
return [];
4954
} catch (DBALException $exception) {
5055
throw new TransportException($exception->getMessage(), 0, $exception);
5156
}

0 commit comments

Comments
 (0)