La cola de fallidos en el componente Messenger de Symfony es una característica muy útil para gestionar los mensajes que no se pueden procesar correctamente. Cuando un mensaje falla al ser manejado, en lugar de perderlo o bloquear el sistema, se puede redirigir a una cola de fallidos donde se puede inspeccionar y decidir qué hacer con él más tarde.
Pasos para utilizar la cola de fallidos en Symfony Messenger:
-
Instalación del componente Messenger: Primero, asegúrate de tener instalado el componente Messenger en tu proyecto Symfony:
composer require symfony/messenger
-
Configuración del transporte: Configura tu transporte en
config/packages/messenger.yaml
. Aquí configuraremos dos transportes: uno para los mensajes principales y otro para la cola de fallidos.framework: messenger: transports: async: dsn: 'doctrine://default' options: table_name: 'messenger_messages' failed: dsn: 'doctrine://default' options: table_name: 'messenger_failed_messages' failure_transport: failed routing: 'App\Message\YourMessage': async
-
Creación de un mensaje y un handler: Crea un mensaje y su handler correspondiente. Por ejemplo, puedes crear un mensaje
YourMessage
y su handlerYourMessageHandler
.// src/Message/YourMessage.php namespace App\Message; class YourMessage { private $content; public function __construct(string $content) { $this->content = $content; } public function getContent(): string { return $this->content; } }
// src/MessageHandler/YourMessageHandler.php namespace App\MessageHandler; use App\Message\YourMessage; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; class YourMessageHandler implements MessageHandlerInterface { public function __invoke(YourMessage $message) { if ($message->getContent() === 'fail') { throw new \Exception('This is a failure example'); } // Process the message... echo $message->getContent(); } }
-
Enviando el mensaje: Envía el mensaje desde algún lugar de tu aplicación, por ejemplo, en un controlador.
// src/Controller/MessageController.php namespace App\Controller; use App\Message\YourMessage; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class MessageController { private $bus; public function __construct(MessageBusInterface $bus) { $this->bus = $bus; } /** * @Route("/send-message", name="send_message") */ public function sendMessage(): Response { $this->bus->dispatch(new YourMessage('fail')); return new Response('Message sent!'); } }
-
Procesando mensajes y manejando fallos: Ejecuta el comando del worker para procesar los mensajes en la cola:
php bin/console messenger:consume async
Si un mensaje falla, será enviado automáticamente a la cola de fallidos configurada (
failed
). -
Inspeccionando y gestionando la cola de fallidos: Symfony proporciona comandos para gestionar la cola de fallidos. Puedes listar los mensajes fallidos y reenviarlos o eliminarlos.
-
Listar mensajes fallidos:
php bin/console messenger:failed:show
-
Reenviar mensajes fallidos:
php bin/console messenger:failed:retry --id=ID_DEL_MENSAJE
-
Eliminar mensajes fallidos:
php bin/console messenger:failed:remove --id=ID_DEL_MENSAJE
-
Ejemplo completo:
Aquí tienes el resumen de los archivos involucrados:
config/packages/messenger.yaml
para configurar los transportes y la cola de fallidos.src/Message/YourMessage.php
para definir el mensaje.src/MessageHandler/YourMessageHandler.php
para manejar el mensaje.src/Controller/MessageController.php
para enviar el mensaje.