Hàng đợi Stomp

Stomp là giao thức tin nhắn định hướng văn bản đơn giản (stream), nó cung cấp một định dạng kết nối có thể tương tác, cho phép các khách hàng STOMP giao tiếp với bất kỳ đại lý tin nhắn STOMP nào (Broker). [workerman/stomp](https://github.com/walkor/stomp) hiện thực hóa khách hàng Stomp, chủ yếu được sử dụng trong các trường hợp hàng đợi tin nhắn như RabbitMQ, Apollo, ActiveMQ.

Cài đặt

composer require webman/stomp

Cấu hình

Tệp cấu hình nằm trong thư mục config/plugin/webman/stomp

Gửi tin nhắn

<?php
namespace app\controller;

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

class Index
{
    public function queue(Request $request)
    {
        // Hàng đợi
        $queue = 'examples';
        // Dữ liệu (khi truyền mảng, cần tự mình tuần tự hóa, chẳng hạn như sử dụng json_encode, serialize, v.v.)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // Thực hiện gửi
        Client::send($queue, $data);

        return response('redis queue test');
    }

}

Để tương thích với các dự án khác, thành phần Stomp không cung cấp chức năng tuần tự hóa tự động, nếu dữ liệu gửi là mảng, cần tự mình tuần tự hóa, và khi tiêu thụ cần tự mình giải tuần tự hóa

Tiêu thụ tin nhắn

Tạo mới app/queue/stomp/MyMailSend.php (tên lớp có thể tùy ý, chỉ cần tuân thủ quy tắc psr4).

<?php
namespace app\queue\stomp;

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

class MyMailSend implements Consumer
{
    // Tên hàng đợi
    public $queue = 'examples';

    // Tên kết nối, tương ứng với stomp.php trong kết nối
    public $connection = 'default';

    // Nếu giá trị là client thì cần gọi $ack_resolver->ack() để thông báo cho máy chủ rằng đã tiêu thụ thành công
    // Nếu giá trị là auto thì không cần gọi $ack_resolver->ack()
    public $ack = 'auto';

    // Tiêu thụ
    public function consume($data, AckResolver $ack_resolver = null)
    {
        // Nếu dữ liệu là mảng, cần tự mình giải tuần tự hóa
        var_export(json_decode($data, true)); // Xuất ra ['to' => 'tom@gmail.com', 'content' => 'hello']
        // Thông báo cho máy chủ rằng đã tiêu thụ thành công
        $ack_resolver->ack(); // Khi ack là auto, có thể bỏ qua cuộc gọi này
    }
}

Kích hoạt giao thức stomp trong rabbitmq

Mặc định rabbitmq không kích hoạt giao thức stomp, cần thực hiện lệnh sau để kích hoạt

rabbitmq-plugins enable rabbitmq_stomp

Sau khi kích hoạt, cổng stomp mặc định là 61613.