Fila Stomp
Stomp é um protocolo simples de mensagens baseado em texto, que fornece um formato de conexão interoperável, permitindo que clientes STOMP interajam com qualquer agente de mensagens STOMP (Broker). O workerman/stomp implementa um cliente Stomp, principalmente usado para 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á localizado 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 = 'exemplos';
// Dados (ao enviar um array, é necessário serializá-lo manualmente, por exemplo usando json_encode, serialize, etc.)
$data = json_encode(['para' => 'tom@gmail.com', 'conteúdo' => 'olá']);
// Executa o 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 serializá-los manualmente e deserializá-los ao consumi-los.
Consumo de Mensagens
Crie um novo arquivo app/queue/stomp/MyMailSend.php
(o nome da classe é arbitrário, desde que siga 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 = 'exemplos';
// Nome da conexão, correspondente à conexão em stomp.php
public $connection = 'padrão';
// Quando o valor for 'client', é necessário chamar $ack_resolver->ack() para informar ao servidor que a mensagem foi consumida com sucesso
// Quando o valor for 'auto', não é necessário chamar $ack_resolver->ack()
public $ack = 'auto';
// Consumo
public function consume($data, AckResolver $ack_resolver = null)
{
// Se os dados forem um array, é necessário deserializá-los manualmente
var_export(json_decode($data, true)); // Saída ['para' => 'tom@gmail.com', 'conteúdo' => 'olá']
// Informa ao servidor que a mensagem foi consumida com sucesso
$ack_resolver->ack(); // Quando ack é 'auto', este método pode ser omitido
}
}
Habilitando o protocolo stomp para o rabbitmq
Por padrão, o rabbitmq não tem o protocolo stomp habilitado e é necessário executar o seguinte comando para habilitá-lo.
rabbitmq-plugins enable rabbitmq_stomp
Após a habilitação, a porta padrão para stomp será 61613.