src/EventSubscriber/FailedMessageSubscriber.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Event\UpdateOrganizationEvent;
  4. use App\Message\ExportMessage;
  5. use App\Service\MailerService;
  6. use Exception;
  7. use Psr\Log\LoggerInterface;
  8. use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
  11. use Symfony\Component\Messenger\Event\WorkerStoppedEvent;
  12. use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
  13. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  14. class FailedMessageSubscriber implements EventSubscriberInterface
  15. {
  16.     private LoggerInterface $logger;
  17.     private MailerService $mailerService;
  18.     public function __construct(
  19.         LoggerInterface $logger,
  20.         MailerService $mailerService
  21.     ) {
  22.         $this->logger $logger;
  23.         $this->mailerService $mailerService;
  24.     }
  25.     public static function getSubscribedEvents()
  26.     {
  27.         return [
  28.             WorkerMessageFailedEvent::class => ['onWorkerMessageFailed'1],
  29.         ];
  30.     }
  31.     public function onWorkerMessageFailed(WorkerMessageFailedEvent $event): void
  32.     {
  33.         $message $event->getEnvelope()->getMessage();
  34.         if ($event->willRetry()) {
  35.             $this->logger->info(sprintf(
  36.                 'Message "%s" will be retried, skipping processing error message',
  37.                 get_class($message)
  38.             ));
  39.             return;
  40.         }
  41.         switch (true) {
  42.             case $message instanceof ExportMessage:
  43.                 $this->onExportMessageFailed($message);
  44.                 break;
  45.         }
  46.     }
  47.     private function onExportMessageFailed(ExportMessage $message): void
  48.     {
  49.         $this->logger->info('==ProcessingErrorMessage==============================================');
  50.         $this->logger->info('Export message failed after all retries, sending error email to user ' $message->getUser()->getUsername(), [$message]);
  51.         try {
  52.             $this->mailerService->sendExportErrorEmail($message->getUser());
  53.         } catch (Exception $e) {
  54.             $this->logger->critical("Critical error when process ERROR email message : " $e->getMessage(), [$message]);
  55.         }
  56.     }
  57. }