Fila Stomp

Stomp é um protocolo simples de mensagens orientado a texto (streaming) que fornece um formato de conexão interoperável, permitindo que clientes STOMP interajam com qualquer corretor de mensagens STOMP (Broker). workerman/stomp implementa um cliente Stomp, utilizado principalmente em cenários de filas de mensagens como RabbitMQ, Apollo, ActiveMQ, etc.

Instalação

composer require webman/stomp

Configuração

O arquivo de configuração está em config/plugin/webman/stomp

Envio de mensagens

<?php
namespace app\controller;

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

class Index
{
    public function queue(Request $request)
    {
        // Fila
        $queue = 'examples';
        // Dados (ao enviar um array, é necessário serializar manualmente, por ex. com json_encode, serialize, etc.)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // Executar o envio
        Client::send($queue, $data);

        return response('redis queue test');
    }

}

Por compatibilidade com outros projetos, o componente Stomp não fornece serialização nem deserialização automáticas. Se os dados enviados forem um array, é necessário serializar manualmente e deserializar ao consumir.

Consumo de mensagens

Crie o arquivo app/queue/stomp/MyMailSend.php (o nome da classe pode ser arbitrário, desde que cumpra o padrão PSR-4).

<?php
namespace app\queue\stomp;

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

class MyMailSend implements Consumer
{
    // Nome da fila
    public $queue = 'examples';

    // Nome da conexão, correspondente à conexão em stomp.php
    public $connection = 'default';

    // Quando o valor for 'client', é necessário chamar $ack_resolver->ack() para informar o servidor que consumiu com sucesso
    // Quando o valor for 'auto', não é necessário chamar $ack_resolver->ack()
    public $ack = 'auto';

    // Consumir
    public function consume($data, AckResolver $ack_resolver = null)
    {
        // Se os dados forem um array, é necessário deserializar manualmente
        var_export(json_decode($data, true)); // output ['to' => 'tom@gmail.com', 'content' => 'hello']
        // Informar o servidor que consumiu com sucesso
        $ack_resolver->ack(); // quando ack for 'auto', esta chamada pode ser omitida
    }
}

Ativar o protocolo Stomp no RabbitMQ

O RabbitMQ não ativa o protocolo Stomp por defeito. Execute o seguinte comando para ativar:

rabbitmq-plugins enable rabbitmq_stomp

Após a ativação, a porta padrão do Stomp é 61613.