3 minutos de lectura

Manejar la cola de fallidos en el componente Messenger

Puntos a ver ...

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:

  1. Instalación del componente Messenger: Primero, asegúrate de tener instalado el componente Messenger en tu proyecto Symfony:

    composer require symfony/messenger
    
  2. 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
    
  3. Creación de un mensaje y un handler: Crea un mensaje y su handler correspondiente. Por ejemplo, puedes crear un mensaje YourMessage y su handler YourMessageHandler.

    // 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();
        }
    }
    
  4. 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!');
        }
    }
    
  5. 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).

  6. 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.