Nuevo en Symfony 4.1: componente Messenger

En Symfony 4.1 se ha añadido un nuevo componente Messenger que permite a las aplicaciones enviar/recibir mensajes hacia/desde otras aplicaciones mediante colas de mensajes. Este componente proporciona un "bus de mensajes" y un enrutador que puedes usar en cualquier servicio e incluso en cualquier controlador:

// src/Controller/DefaultController.php
namespace App\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;
 
class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function index(MessageBusInterface $bus)
    {
        // ...
 
        $bus->dispatch(new MyMessage());
    }
}

Enviar mensajes es solo el primer paso de un sistema de mensajería. El siguiente paso es crear "message handlers" para procesar los mensajes. Estos handlers se crean mediante servicios etiquetados con messenger.message_handler:

// src/MessageHandler/MyMessageHandler.php
namespace App\MessageHandler;
 
class MyMessageHandler
{
    public function __invoke(MyMessage $message)
    {
        // procesar el mensaje de alguna manera
    }
}

Colas y adaptadores para AMQP

Este componente también incluye un adaptador listo para comunicarse con algunos de los brokers AMQP más populares, como por ejemplo RabbitMQ. La comunicación con otros sistemas de colas (Kafka, Amazon SQS, Google Pub/sub) se ha delegado por momento a librerías externas como Enqueue:

# config/packages/messenger.yaml
framework:
    messenger:
        adapters:
            default: "amqp://guest:guest@localhost:5672/%2f/messages"

Esta configuración hace que los mensajes se enruten a messenger.default_adapter y también crea messenger.default_sender y messenger.default_receiver para enrutar y consumir los mensajes respectivamente.

Enrutamiento

En lugar de utilizar un handler, también puedes enrutar los mensajes a uno o más senders:

# config/packages/messenger.yaml
framework:
    messenger:
        routing:
            # enruta este mensaje a un único sender
            'My\Message\Message':  messenger.default_sender
 
            # enruta este mensaje a varios senders
            'My\Message\ToBeSentToTwoSenders': [messenger.default_sender, messenger.audit_sender]
 
            # enruta el resto de mensajes al sender por defecto
            '*': messenger.default_sender

Una vez enviados, los mensajes se pueden consumir con el comando messenger:consume-messages:

$ bin/console messenger:consume-messages messenger.default_receiver

El bus de mensajes creado por el componente Messenger se basa en middlewares. Puedes leer más sobre ello en la documentación del componente Messenger.

Esta funcionalidad fue contribuida por Samuel Roze en el pull request #24411.

Fuente: New in Symfony 4.1: Messenger component

Comentarios

Publicada el

17 de mayo de 2018

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.