Очередь Stomp

Stomp - это простой текстовый протокол для направленной передачи сообщений, обеспечивающий взаимодействие клиентов Stomp с любым посредником сообщений Stomp (брокером). workerman/stomp реализует клиент Stomp, который в основном используется для сценариев очередей сообщений, таких как RabbitMQ, Apollo, ActiveMQ и т. д.

Установка

composer require webman/stomp

Конфигурация

Файл конфигурации находится в config/plugin/webman/stomp

Отправка сообщений

<?php
namespace app\controller;

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

class Index
{
    public function queue(Request $request)
    {
        // Очередь
        $queue = 'examples';
        // Данные (при передаче массива необходимо выполнить его собственную сериализацию, например, используя json_encode, serialize и т. д.)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // Отправить сообщение
        Client::send($queue, $data);

        return response('тест очереди Redis');
    }

}

Для обеспечения совместимости с другими проектами компонент Stomp не предоставляет автоматическую сериализацию и десериализацию данных. Если передаются массивы данных, необходимо выполнить их собственную сериализацию, а затем выполнить десериализацию при потреблении.

Потребление сообщений

Создайте файл app/queue/stomp/MyMailSend.php (название класса произвольное, главное, чтобы оно соответствовало правилам psr4).

<?php
namespace app\queue\stomp;

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

class MyMailSend implements Consumer
{
    // Название очереди
    public $queue = 'examples';

    // Имя соединения, соответствующее подключению в stomp.php
    public $connection = 'default';

    // При значении "client" необходимо вызвать $ack_resolver->ack(), чтобы сообщить серверу, что сообщение успешно потреблено
    // При значении "auto" вызов $ack_resolver->ack() не требуется
    public $ack = 'auto';

    // Потребление
    public function consume($data, AckResolver $ack_resolver = null)
    {
        // Если данные представляют собой массив, необходима собственная десериализация
        var_export(json_decode($data, true)); // вывод ['to' => 'tom@gmail.com', 'content' => 'hello']
        // Подтвердить успешное потребление серверу
        $ack_resolver->ack(); // при ack = auto это вызов можно пропустить
    }
}

Включение протокола stomp в rabbitmq

По умолчанию протокол stomp не включен в rabbitmq и требует выполнения следующей команды для включения

rabbitmq-plugins enable rabbitmq_stomp

После включения порт stomp по умолчанию равен 61613.