<?php
namespace App\EventSubscriber;
use App\Event\UpdateOrganizationEvent;
use App\Message\ExportMessage;
use App\Service\MailerService;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Component\Messenger\Event\WorkerStoppedEvent;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
class FailedMessageSubscriber implements EventSubscriberInterface
{
private LoggerInterface $logger;
private MailerService $mailerService;
public function __construct(
LoggerInterface $logger,
MailerService $mailerService
) {
$this->logger = $logger;
$this->mailerService = $mailerService;
}
public static function getSubscribedEvents()
{
return [
WorkerMessageFailedEvent::class => ['onWorkerMessageFailed', 1],
];
}
public function onWorkerMessageFailed(WorkerMessageFailedEvent $event): void
{
$message = $event->getEnvelope()->getMessage();
if ($event->willRetry()) {
$this->logger->info(sprintf(
'Message "%s" will be retried, skipping processing error message',
get_class($message)
));
return;
}
switch (true) {
case $message instanceof ExportMessage:
$this->onExportMessageFailed($message);
break;
}
}
private function onExportMessageFailed(ExportMessage $message): void
{
$this->logger->info('==ProcessingErrorMessage==============================================');
$this->logger->info('Export message failed after all retries, sending error email to user ' . $message->getUser()->getUsername(), [$message]);
try {
$this->mailerService->sendExportErrorEmail($message->getUser());
} catch (Exception $e) {
$this->logger->critical("Critical error when process ERROR email message : " . $e->getMessage(), [$message]);
}
}
}