vendor/shopware/core/Framework/MessageQueue/Subscriber/MessageFailedHandler.php line 30

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\MessageQueue\Subscriber;
  3. use Doctrine\DBAL\Connection;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\Messenger\Envelope;
  6. use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
  7. class MessageFailedHandler implements EventSubscriberInterface
  8. {
  9.     /**
  10.      * @var Connection
  11.      */
  12.     private $connection;
  13.     public function __construct(Connection $connection)
  14.     {
  15.         $this->connection $connection;
  16.     }
  17.     public static function getSubscribedEvents(): array
  18.     {
  19.         return [
  20.             // must have higher priority than SendFailedMessageToFailureTransportListener
  21.             WorkerMessageFailedEvent::class => ['onMessageFailed'99],
  22.         ];
  23.     }
  24.     public function onMessageFailed(WorkerMessageFailedEvent $event): void
  25.     {
  26.         if ($event->willRetry()) {
  27.             return;
  28.         }
  29.         $this->connection->executeUpdate('
  30.             UPDATE `message_queue_stats`
  31.             SET `size` = `size` - 1
  32.             WHERE `name` = :name;
  33.         ', [
  34.             'name' => $this->getMessageName($event->getEnvelope()),
  35.         ]);
  36.     }
  37.     /**
  38.      * @param object|Envelope $message
  39.      */
  40.     private function getMessageName($message): string
  41.     {
  42.         return $message instanceof Envelope ? \get_class($message->getMessage()) : \get_class($message);
  43.     }
  44. }