Cola STOMP

STOMP es un Protocolo Simple de Mensajes basado en texto que proporciona un formato de conexión interoperable que permite a los clientes STOMP interactuar con cualquier intermediario de mensajes (broker) STOMP. workerman/stomp implementa un cliente STOMP, que se utiliza principalmente en escenarios de cola de mensajes como RabbitMQ, Apollo, ActiveMQ, etc.

Instalación

composer require webman/stomp

Configuración

El archivo de configuración se encuentra en config/plugin/webman/stomp

Envío de mensajes

<?php
namespace app\controller;

use support\Request;
use Webman\Stomp\Client;

class Index
{
    public function queue(Request $request)
    {
        // Cola
        $queue = 'ejemplos';
        // Datos (si se está enviando un array, es necesario serializarlo manualmente, por ejemplo usando json_encode, serialize, etc.)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // Realizar el envío
        Client::send($queue, $data);

        return response('Prueba de cola de redis');
    }

}

Para ser compatible con otros proyectos, el componente STOMP no proporciona funciones de serialización y deserialización automáticas. Si se envían datos en forma de array, es necesario serializarlos manualmente y deserializarlos al consumirlos.

Consumo de mensajes

Crear el archivo app/queue/stomp/MyMailSend.php (el nombre de la clase puede ser cualquiera, siempre que cumpla con el estándar PSR-4).

<?php
namespace app\queue\stomp;

use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;

class MyMailSend implements Consumer
{
    // Nombre de la cola
    public $queue = 'ejemplos';

    // Nombre de la conexión, en correspondencia con la conexión en stomp.php
    public $connection = 'default';

    // Si el valor es 'client', se debe llamar a $ack_resolver->ack() para notificar al servidor que se ha consumido exitosamente
    // Si el valor es 'auto', no es necesario llamar a $ack_resolver->ack()
    public $ack = 'auto';

    // Consumir
    public function consume($data, AckResolver $ack_resolver = null)
    {
        // Si los datos son un array, es necesario deserializarlos manualmente
        var_export(json_decode($data, true)); // imprime ['to' => 'tom@gmail.com', 'content' => 'hello']
        // Notificar al servidor que se ha consumido exitosamente
        $ack_resolver->ack(); // cuando ack es 'auto', este paso puede omitirse
    }
}

Habilitar el protocolo STOMP en rabbitmq

Por defecto, rabbitmq no tiene habilitado el protocolo STOMP. Es necesario ejecutar el siguiente comando para habilitarlo.
rabbitmq-plugins enable rabbitmq_stomp
Una vez habilitado, el puerto por defecto para STOMP es el 61613.