CRMEB v4 消息隊(duì)列

2022-04-11 11:42 更新

說明

將之前在定時任務(wù)和事件里面的眾多方法轉(zhuǎn)移消息隊(duì)列中,提升系統(tǒng)運(yùn)行速度。

文件目錄結(jié)構(gòu)

├─crmeb        CREMB核心類庫
│  ├─jobs      消息隊(duì)列

Queue使用方式

Queue::instance()->do('方法名稱')->job(類名稱::class)->secs('延遲時間(s)')->data(參數(shù)1,參數(shù)2,····)->push();
 do(string $do) 設(shè)置任務(wù)執(zhí)行方法,不調(diào)用默認(rèn)執(zhí)行doJob方法,
 job(string $job) 設(shè)置任務(wù)執(zhí)行類名,必填,例: job(TestJob::class)
 errorCount(int $errorCount) 執(zhí)行失敗次數(shù),不調(diào)用默認(rèn)3次
 data(...$data) 執(zhí)行數(shù)據(jù),無參數(shù)可以不調(diào)用
 secs(int $secs) 延遲執(zhí)行秒數(shù),不調(diào)用加入正常隊(duì)列,參數(shù)不為0加入延遲隊(duì)列,延遲$secs執(zhí)行

子任務(wù)和單任務(wù)

子任務(wù)

使用do方法時,傳入方法名稱,執(zhí)行隊(duì)列時會執(zhí)行該類中對應(yīng)的方法,
例如模板消息隊(duì)列類,類中有眾多發(fā)送模板消息的方法,使用do方法調(diào)用某個方法執(zhí)行。
return Queue::instance()->do('sendOrderTakeSuccess')->job(WechatTemplateJob::class)->data($openid, $order, $title)->push();
class WechatTemplateJob extends BaseJob
{
    /**
     * 支付成功發(fā)送模板消息
     * @param $order
     * @return bool
     */
    public function sendOrderPaySuccess($openid, $order)
    {
        return $this->sendTemplate('ORDER_PAY_SUCCESS', $openid, [
            'first' => '親,您購買的商品已支付成功',
            'keyword1' => $order['order_id'],
            'keyword2' => $order['pay_price'],
            'remark' => '點(diǎn)擊查看訂單詳情'
        ], sys_config('site_url') . Route::buildUrl('/pages/order_details/index?order_id=' . $order['order_id'])->suffix('')->domain(false)->build());
    }
    /**
     * 確認(rèn)收貨發(fā)送模板消息
     * @param $order
     * @return bool|mixed
     */
    public function sendOrderTakeSuccess($openid, $order, $title)
    {
        return $this->sendTemplate('ORDER_TAKE_SUCCESS', $openid, [
            'first' => '親,您的訂單已收貨',
            'keyword1' => $order['order_id'],
            'keyword2' => '已收貨',
            'keyword3' => date('Y-m-d H:i:s', time()),
            'keyword4' => $title,
            'remark' => '感謝您的光臨!'
        ]);
    }
}

單任務(wù)

不使用do方法時,系統(tǒng)會自動調(diào)用類中的doJob執(zhí)行隊(duì)列,該類只實(shí)現(xiàn)了一個功能
例如訂單未支付10分鐘后發(fā)送短信,類中只有一個doJob的方法,隊(duì)列執(zhí)行時調(diào)用該方法執(zhí)行。

Queue::instance()->job(UnpaidOrderSend::class)->secs(600)->data($orderId)->push();
/**
 * 未支付10分鐘后發(fā)送短信
 * Class UnpaidOrderSend
 * @package crmeb\jobs
 */
class UnpaidOrderSend extends BaseJob
{
    public function doJob($id)
    {
        /** @var StoreOrderServices $services */
        $services = app()->make(StoreOrderServices::class);
        $orderInfo = $services->get($id);
        if (!$orderInfo) {
            return true;
        }
        if ($orderInfo->paid) {
            return true;
        }
        if ($orderInfo->is_del) {
            return true;
        }
        /** @var SmsSendServices $smsServices */
        $smsServices = app()->make(SmsSendServices::class);
        $smsServices->send(true, $orderInfo['user_phone'], ['order_id' => $orderInfo['order_id']], 'ORDER_PAY_FALSE');
        return true;
    }
}

延遲隊(duì)列

加入消息隊(duì)列時不調(diào)用secs方法,直接加入到隊(duì)列中,依次執(zhí)行。
Queue::instance()->job(UnpaidOrderSend::class)->data($orderId)->push();//立即執(zhí)行未付款發(fā)送短信
調(diào)用secs方法并傳入秒數(shù)時,隊(duì)列加入延遲隊(duì)列,多少秒后執(zhí)行該隊(duì)列。
Queue::instance()->job(UnpaidOrderSend::class)->secs(600)->data($orderId)->push();//600秒后執(zhí)行未付款發(fā)送短信
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號