<?php
namespace App\EventSubscriber;
use App\Message\ExportMessage;
use App\Service\MailerService;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Component\Messenger\Event\WorkerStoppedEvent;
use Vdm\Bundle\LibraryBundle\Service\StopWorkerService;
class FailedMessageSubscriber implements EventSubscriberInterface
{
private LoggerInterface $logger;
private MailerService $mailerService;
private StopWorkerService $stopWorkerService;
public function __construct(
LoggerInterface $logger,
MailerService $mailerService,
StopWorkerService $stopWorkerService
) {
$this->logger = $logger;
$this->mailerService = $mailerService;
$this->stopWorkerService = $stopWorkerService;
}
public static function getSubscribedEvents()
{
return [
WorkerMessageFailedEvent::class => ['onWorkerMessageFailed', 1],
WorkerStoppedEvent::class => ['onWorkerStoppedEvent', 1],
];
}
public function onWorkerMessageFailed(WorkerMessageFailedEvent $event): void
{
$message = $event->getEnvelope()->getMessage();
if ($event->willRetry()) {
$this->logger->info(sprintf(
'Message "%s" will be retried, skipping sending error message.',
get_class($message)
));
return;
}
switch (true) {
case $message instanceof ExportMessage:
$this->onExportMessageFailed($message);
break;
}
}
public function onWorkerStoppedEvent(WorkerStoppedEvent $event): void
{
// Avoid to break consumer in RethrowExceptionAfterWorkerStoppedSubscriber
$this->stopWorkerService->setThrowable(null);
}
private function onExportMessageFailed(ExportMessage $message): void
{
$this->logger->info('==SendingErrorEmail==============================================');
$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]);
}
}
}