8000 [Messenger] return empty envelopes when RetryableException occurs · symfony/symfony@b94e988 · GitHub
[go: up one dir, main page]

Skip to content

Commit b94e988

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

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

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

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

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

14+
use Doctrine\DBAL\Driver\PDOException;
15+
use Doctrine\DBAL\Exception\DeadlockException;
16+
use Doctrine\DBAL\Exception\DriverException;
1417
use PHPUnit\Framework\TestCase;
1518
use Symfony\Component\Messenger\Envelope;
1619
use Symfony\Component\Messenger\Exception\MessageDecodingFailedException;
@@ -68,6 +71,17 @@ public function testItRejectTheMessageIfThereIsAMessageDecodingFailedException()
6871
$receiver->get();
6972
}
7073

74+
public function testOccursRetryableExceptionFromConnection()
75+
{
76+
$serializer = $this->createSerializer();
77+
$connection = $this->createMock(Connection::class);
78+
$driverException = new PDOException(new \PDOException('Deadlock', 40001));
79+
$connection->method('get')->willThrowException(new DeadlockException('Deadlock', $driverException));
80+
$receiver = new DoctrineReceiver($connection, $serializer);
81+
$actualEnvelopes = $receiver->get();
82+
$this->assertSame([], $actualEnvelopes);
83+
}
84+
7185
public function testAll()
7286
{
7387
$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)
0