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。