Fila Stomp

Stomp é um protocolo de mensagens direcionadas simples (stream), que fornece um formato de conexão interoperável, permitindo que clientes STOMP interajam com qualquer broker de mensagens STOMP. A implementação do cliente Stomp está em workerman/stomp, sendo principalmente utilizada em cenários de filas de mensagens como RabbitMQ, Apollo, ActiveMQ, entre outros.

Instalação

composer require webman/stomp

Configuração

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

Enviar Mensagem

<?php
namespace app\controller;

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

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

        return response('teste de fila redis');
    }
}

Para compatibilidade com outros projetos, o componente Stomp não fornece funcionalidade automática de serialização e desserialização. Se os dados enviados forem um array, é necessário serializar manualmente e, ao consumir, desserializar manualmente.

Consumir Mensagem

Crie app/queue/stomp/MyMailSend.php (o nome da classe pode ser qualquer um, desde que siga a norma psr4).

<?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 ao definido em stomp.php
    public $connection = 'default';

    // Se o valor for client, é necessário chamar $ack_resolver->ack() para informar ao servidor que foi consumido com sucesso
    // Se 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 desserializar manualmente
        var_export(json_decode($data, true)); // Saída: ['to' => 'tom@gmail.com', 'content' => 'hello']
        // Informar ao servidor que foi consumido com sucesso
        $ack_resolver->ack(); // Se ack for auto, esta chamada pode ser ignorada
    }
}

Habilitar o Protocolo Stomp no RabbitMQ

O RabbitMQ não habilita o protocolo Stomp por padrão, você precisa executar o seguinte comando para habilitá-lo:

rabbitmq-plugins enable rabbitmq_stomp

Após a habilitação, a porta padrão do Stomp será 61613.