คิว Stomp

Stomp เป็นโปรโตคอลข้อความที่เป็นข้อความแบบข้อความที่เชื่อมต่อโดยแบบโครงสร้างข้อมูลเรียบง่าย (text-oriented messaging protocol) ซึ่งมีรูปแบบการเชื่อมต่อที่สามารถปฏิบัติงานร่วมกับการเชื่อมต่อ ทำให้ไคลเอ็นต์ 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');
    }

}

เพื่อให้เข้ากันได้กับโปรเจ็กต์อื่น ๆ Componemt 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(); // อ็คเป็น auto สามารถละเลยการเรียกใช้
    }
}

เปิดใช้งานโปรโตคอล stomp ของ rabbitmq

rabbitmq ไม่ได้เปิดใช้งานโปรโตคอล stomp แบบค่าเริ่มต้น จึงต้องทำการเปิดด้วยคำสั่งต่อไปนี้

rabbitmq-plugins enable rabbitmq_stomp

หลังจากเปิดใช้งาน พอร์ตของ stomp จะเป็น 61613 โดยค่าเริ่มต้น