laravel redis 延遲隊列

應用場景

  • 1.會員過期前3天發送召回通知

  • 2.訂單支付成功後,5分鐘後檢測下游環節是否都正常,比如用戶購買會員後,各種會員狀態是否都設置成功

  • 3.如何定期檢查處於退款狀態的訂單是否已經退款成功?

  • 4.實現通知失敗,1,3,5,7分鐘重複通知,直到對方回覆?

$post['beginTime'] = Carbon::now()->addMinutes(1);

endTask::dispatch($resPost)->delay($resPost->beginTime);

php artisan make:job endTask --queued

app/jobs endTask :
protected $order;
/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct(Order $order, $delay)
{
    //
    $this->order=$order;
    // 設置延遲的時間,delay() 方法的參數代表多少秒之後執行
    $this->delay($delay);
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    //延遲執行的業務邏輯
    // 判斷對應的訂單是否已經被支付
    // 如果已經支付則不需要關閉訂單,直接退出
    if ($this->order->paid_at) {
        return;
    }
    // 通過事務執行 sql
    \DB::transaction(function() {
        // 將訂單的 closed 字段標記爲 true,即關閉訂單
        $this->order->update(['closed' => 1]);
        // 循環遍歷訂單中的商品 SKU,將訂單中的數量加回到 SKU 的庫存中去
        foreach ($this->order->items as $item) {
            $item->productSku->addStock($item->amount);
        }
    });
}

php artisan queue:work --daemon
 

三種情況:

  • queue:work 默認只執行一次隊列請求,當請求執行完成後就終止;
  • queue:listen 監聽隊列請求,只要運行着,就能一直接受請求,除非手動終止;
  • queue:work --daemon 同 listen 一樣,只要運行着,就能一直接受請求,不一樣的地方是在這個運行模式下,當新的請求到來的時候,不重新加載整個框架 , 而是直接 fire 動作.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章