Cola STOMP

STOMP es un protocolo simple de mensajería orientado a texto (streaming) que proporciona un formato de conexión interoperable, permitiendo a los clientes STOMP interactuar con cualquier intermediario de mensajes (broker) STOMP. workerman/stomp implementa el cliente Stomp y se utiliza principalmente en escenarios de colas 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 = 'examples';
        // Datos (al enviar un array, hay que serializarlo manualmente, por ejemplo con json_encode, serialize, etc.)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // Ejecutar el envío
        Client::send($queue, $data);

        return response('redis queue test');
    }

}

Por compatibilidad con otros proyectos, el componente Stomp no ofrece serialización ni deserialización automática. Si se envían datos en forma de array, hay que serializarlos manualmente y deserializarlos al consumir.

Consumo de mensajes

Crea el archivo app/queue/stomp/MyMailSend.php (el nombre de la clase puede ser cualquiera, siempre que cumpla 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 = 'examples';

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

    // Si el valor es 'client', hay que llamar a $ack_resolver->ack() para notificar al servidor el consumo correcto
    // Si el valor es 'auto', no hace falta llamar a $ack_resolver->ack()
    public $ack = 'auto';

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

Habilitar el protocolo STOMP en RabbitMQ

Por defecto, RabbitMQ no tiene habilitado el protocolo STOMP. Hay que ejecutar el siguiente comando para habilitarlo:

rabbitmq-plugins enable rabbitmq_stomp

Una vez habilitado, el puerto predeterminado de STOMP es 61613.