* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\Doctrine\Messenger; use Doctrine\DBAL\DBALException; use Doctrine\DBAL\Exception; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Stamp\ConsumedByWorkerStamp; /** * Checks whether the connection is still open or reconnects otherwise. * * @author Fuong */ class DoctrinePingConnectionMiddleware extends AbstractDoctrineMiddleware { protected function handleForManager(EntityManagerInterface $entityManager, Envelope $envelope, StackInterface $stack): Envelope { if (null !== $envelope->last(ConsumedByWorkerStamp::class)) { $this->pingConnection($entityManager); } return $stack->next()->handle($envelope, $stack); } private function pingConnection(EntityManagerInterface $entityManager) { $connection = $entityManager->getConnection(); try { $connection->executeQuery($connection->getDatabasePlatform()->getDummySelectSQL()); } catch (DBALException | Exception $e) { $connection->close(); $connection->connect(); } if (!$entityManager->isOpen()) { $this->managerRegistry->resetManager($this->entityManagerName); } } }