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
- 生成文件如图:
- 编写任务代码:
<?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
然后再重新消费队列…
结果
日志:
本作品采用《CC 协议》,转载必须注明作者和本文链接
最近使用了一下 tp的队列 发现tp的队列任务执行完要执行一下删除任务,不然那个任务会循环执行,laravel的队列好像执行完就结束了,不知道我理解的对不对,指点一下。
上面怎么用sleep 不是延迟队列