Cola Stomp

Stomp es un protocolo de mensajería simple (y orientado a flujo) que proporciona un formato de conexión interoperable, permitiendo a los clientes STOMP interactuar con cualquier broker de mensajes STOMP. workerman/stomp implementa un cliente Stomp, utilizado principalmente en escenarios de colas de mensajes como RabbitMQ, Apollo, ActiveMQ, entre otros.

Instalación

composer require webman/stomp

Configuración

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

Enviar mensajes

<?php
namespace app\controller;

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

class Index
{
    public function queue(Request $request)
    {
        // Cola
        $queue = 'examples';
        // Datos (al pasar un array, se necesita serializarlo manualmente, por ejemplo, usando json_encode, serialize, etc.)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // Ejecutar el envío
        Client::send($queue, $data);

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

}

Para ser compatible con otros proyectos, el componente Stomp no proporciona funcionalidad de serialización/deserialización automática. Si se envían datos en forma de array, se requiere serializar manualmente y deserializar al consumir.

Consumir mensajes

Crea app/queue/stomp/MyMailSend.php (el nombre de la clase es arbitrario, siempre que cumpla con la norma psr4).

<?php
namespace app\queue\stomp;

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

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

    // Nombre de conexión, correspondiente a stomp.php
    public $connection = 'default';

    // Si el valor es client, se necesita llamar a $ack_resolver->ack() para informar al servidor que se ha consumido correctamente
    // 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, se necesita deserializar manualmente
        var_export(json_decode($data, true)); // Salida: ['to' => 'tom@gmail.com', 'content' => 'hello']
        // Informar al servidor que se ha consumido correctamente
        $ack_resolver->ack(); // La llamada puede omitirse si ack es auto
    }
}

Activar el protocolo stomp en RabbitMQ

Por defecto, RabbitMQ no tiene habilitado el protocolo stomp, se debe ejecutar el siguiente comando para habilitarlo:

rabbitmq-plugins enable rabbitmq_stomp

Después de habilitarlo, el puerto por defecto para stomp es 61613.