laravel8.x --- 消息队列 [database] 驱动

配置.env

QUEUE_CONNECTION=database

生成数据迁移表

php artisan queue:table   任务队列表
php artisan queue:failed-table  执行任务失败后,存储的表

php artisan migrate  执行迁移
  • jobs表结构
CREATE TABLE `jobs` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `queue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `payload` longtext COLLATE utf8_unicode_ci NOT NULL,
  `attempts` tinyint(3) UNSIGNED NOT NULL,
  `reserved_at` int(10) UNSIGNED DEFAULT NULL,
  `available_at` int(10) UNSIGNED NOT NULL,
  `created_at` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  • failed_jobs表结构
CREATE TABLE `failed_jobs` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `uuid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `connection` text COLLATE utf8_unicode_ci NOT NULL,
  `queue` text COLLATE utf8_unicode_ci NOT NULL,
  `payload` longtext COLLATE utf8_unicode_ci NOT NULL,
  `exception` longtext COLLATE utf8_unicode_ci NOT NULL,
  `failed_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

创建测试的队列任务

php artisan make:job NoticeJob
  • 生成文件如图:

laravel8.x  ---  消息队列  [database]  驱动

  • 编写任务代码:
<?php

namespace App\Jobs;

use App\Models\Notice;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;

class NoticeJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $notice;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($notice)
    {
        //
        $this->notice = $notice;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
        sleep(10);
        Notice::where('id', $this->notice)->update(['title' => 'demo23']);
        Log::info("修改【notice】:id=>" . $this->notice . "成功");
    }
}

控制器代码

    public function demo ()
    {
        NoticeJob::dispatch(2);
        //....
    }

创建路由访问控制器对应方法

jobs表会新增一条相应数据……

消费队列任务

php artisan queue:work
  • 成功则对应jobs表中数据会消失
  • 失败则failed_jobs表中会新增一条对应数据,日志也会记录错误

注意:每次修改任务代码(即handel())需要执行更新指令

php artisan queue:restart

然后再重新消费队列…

结果

laravel8.x  ---  消息队列  [database]  驱动

日志:

laravel8.x  ---  消息队列  [database]  驱动

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

最近使用了一下 tp的队列 发现tp的队列任务执行完要执行一下删除任务,不然那个任务会循环执行,laravel的队列好像执行完就结束了,不知道我理解的对不对,指点一下。

1年前 评论
隐德莱希 (楼主) 1年前

上面怎么用sleep 不是延迟队列

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!