Stomp คิว

Stomp เป็นโปรโตคอลข้อความแบบกำหนดทิศทางที่ง่าย (streaming text) ซึ่งให้รูปแบบการเชื่อมต่อที่สามารถทำงานร่วมกันได้ ซึ่งช่วยให้ไคลเอนต์ STOMP สามารถโต้ตอบกับตัวแทนข้อความ STOMP (Broker) ใด ๆ ได้ workerman/stomp ได้ implement Stomp client ซึ่งใช้หลัก ๆ สำหรับ 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';
        // ข้อมูล (เมื่อส่งข้อมูลแบบ array ต้องทำการ serialize ด้วยตนเอง เช่น ใช้ json_encode, serialize เป็นต้น)
        $data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
        // ทำการส่ง
        Client::send($queue, $data);

        return response('redis queue test');
    }

}

เพื่อความเข้ากันได้กับโปรเจ็คอื่น ๆ คอมโพเนนต์ Stomp ไม่มีฟังก์ชันการทำงานอัตโนมัติในการ serialize และ deserialize หากส่งข้อมูลเป็น array ต้องทำการ serialize ด้วยตนเอง และเมื่อบริโภคต้องทำการ deserialize ด้วยตนเอง

การบริโภคข้อความ

สร้างไฟล์ใหม่ 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)
    {
        // หากข้อมูลเป็น array ต้องทำการ deserialize ด้วยตนเอง
        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。