1.首先在rabbmitmq增加一個名為demo的交換機
2.然后增加一個名為demo_test的隊列
3.隊列與交換機綁定,路由鍵隨便寫的,與隊列名一樣
4.webman安裝
composer require teamones/stomp-queue
5.在config增加stomp配置
6.投遞消息
7.消費位置
8.
改了端口之后:
按照destination增加了名為default.demo的交換機和名為default.demo_test的隊列,然后倆者根據(jù)
路由鍵default.demo_test進行了綁定
問題:這一頓操作下來,消息是投遞成功了,但是消費者沒有觸發(fā),請問是queue/stomp/demo.php的代碼有問題,還是觸發(fā)消費者還需要其他的一些操作,亦或者我手動創(chuàng)建的交換機,隊列,路由這一環(huán)節(jié)有問題?
https://www.rabbitmq.com/stomp.html
http://www.wtbis.cn/plugin/13#%E9%A1%B9%E7%9B%AE%E5%9C%B0%E5%9D%80
按照手冊stomp應該連 61613 端口,你可能連錯了端口了
我弄了個新的ubuntu服務器試了下,很順利就通了
1、安裝rabbitmq-server,apt-get install rabbitmq-server
2、啟用stomp,rabbitmq-plugins enable rabbitmq_stomp
3、按照手冊安裝webman/stomp
,composer require webman/stomp
4、按照手冊新建控制器投遞消息
<?php
namespace app\controller;
use support\Request;
use Webman\Stomp\Client;
class Index
{
public function queue(Request $request)
{
// 隊列
$queue = 'examples';
// 數(shù)據(jù)(傳遞數(shù)組時需要自行序列化,比如使用json_encode,serialize等)
$data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
// 執(zhí)行投遞
Client::send($queue, $data);
return response('redis queue test');
}
}
5、按照手冊新建消費者消費消息
<?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 時需要調(diào)用$ack_resolver->ack()告訴服務端已經(jīng)成功消費
// 值為 auto 時無需調(diào)用$ack_resolver->ack()
public $ack = 'auto';
// 消費
public function consume($data, AckResolver $ack_resolver = null)
{
// 如果是數(shù)據(jù)是數(shù)組,需要自行反序列化
var_export(json_decode($data, true)); // 輸出 ['to' => 'tom@gmail.com', 'content' => 'hello']
// 告訴服務端,已經(jīng)成功消費
$ack_resolver->ack(); // ack為 auto時可以省略此調(diào)用
}
}
6、啟動workerman
7、訪問控制器http://127.0.0.1:8787/index/queue
,
8、終端顯示消費成功
以上rabbitmq除了apt-get install rabbitmq-server
rabbitmq-plugins enable rabbitmq_stomp
2句命令,什么都沒設置,代碼完全照抄手冊,一次成功
接著上面的步驟,增加了如下操作
1、下載組件 rabbitmq_delayed_message_exchange 到 /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.2/plugins
(我本地目錄是這個,各個系統(tǒng)可能不一樣)
2、執(zhí)行 rabbitmq-plugins enable rabbitmq_delayed_message_exchange
3、按照手冊安裝 composer require teamones/stomp-queue
4、重啟rabbitmq和webman
5、訪問 http://127.0.0.1:8787/index/queue 得到如下結(jié)果
可能是 teamones/stomp-queue
自帶什么設置,和前面的截圖比較調(diào)試信息沒了,但是確實消費了
就是手冊的配置
config/stomp.php
config/plugin/webman/stomp/stomp.php
有2個配置配置文件,我不清楚哪個配置是生效的。config/plugin/webman/stomp/stomp.php是自動生成的,config/stomp.php是執(zhí)行完composer require teamones/stomp-queue
后按照手冊加的。
rabbitmq只執(zhí)行過rabbitmq-plugins enable rabbitmq_stomp
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
沒有做過其他配置
teamones/stomp-queue
是第三方的,文檔可能過期了,文檔先暫時隱藏。
rabbitmq延遲隊列服務端設置參考文檔 https://blog.rabbitmq.com/posts/2015/04/scheduling-messages-with-rabbitmq
按照文檔,延遲時間可以通過header傳遞,
Client::send($queue, $data, ['x-delay' => 10*1000]);
stomp插件有時候會丟失消息,如圖所示,生產(chǎn)了,確沒有消費, 還有一個問題,重啟rabbitmq后,所有的消息都會丟失,沒有持久化,不知道什么原因