Очередь 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 queue test');
    }

}

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

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

Создайте файл app/queue/stomp/MyMailSend.php (имя класса может быть любым при соблюдении стандарта PSR-4).

<?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

По умолчанию RabbitMQ не включает протокол Stomp. Выполните следующую команду для включения:

rabbitmq-plugins enable rabbitmq_stomp

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