您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
列出已完成和未完成的Task(laravel11队列中job完成的after事件)
发布时间:2024-11-06 17:54:23编辑:雪饮阅读()
-
据官网的文档来说,其实如果你的队列是redis队列,则可以使用horizon的面板来管理队列,其中就包含了队列的是否完成
./vendor/bin/sail composer require laravel/horizon
./vendor/bin/sail artisan horizon:install
访问url如http://localhost/horizon/
但我们这是之前是基于默认的mysql进行创建的队列。
那么如果你队列任务投递的时候是实时投递的情况下,基本上你投寄的瞬间队列就完成了,或许你可以把队列的任务增加的更重点也可以达到,不会立马完成的效果。
但我这里采取延时调度的方式。
public function exportAsync(){
ProcessProject::dispatch();
ProcessProject::dispatch()->delay(now()->addMinutes(10));
}
这里基于上篇我们额外多一个延时调度,让队列在10分钟后再处理。
那么此时我们的jobs数据表中的条目也就是未完成的Task,当然你也可以认为失败的Task也算是未完成,那么访问failed_jobs数据表就是存放的已失败的任务。
那么所以我们创建一个Task控制器
./vendor/bin/sail artisan make:controller Task
以及jobs模型
./vendor/bin/sail artisan make:model Jobs
关联下表名
protected $table = 'jobs';
以及失败的jobs对应的模型
./vendor/bin/sail artisan make:model FailedJobs
同样关联下表名
protected $table = 'failed_jobs';
假定task控制器的index方法就是接下来我们要展示已完成和未完成的方法,所以路由也定义下
Route::get('/task/index', [Task::class, 'index'])->name('task.index');
同样我们需要创建一个已完成的jobs表
CREATE TABLE `finish_jobs` (
`id` int NOT NULL AUTO_INCREMENT,
`uuid` char(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
./vendor/bin/sail artisan make:model FinishJobs
配置表名
protected $table = 'finish_jobs';
忽略时间戳处理
public $timestamps = false;
在app的服务提供者中启动队列job完成时的钩子事件。
AppServiceProvider.php中的boot方法中新增如
Queue::after(function (JobProcessed $event) {
info('after事件:'.$event->job->uuid());
$FinishJobs=new FinishJobs();
$FinishJobs->uuid=$event->job->uuid();
$FinishJobs->save();
});
那么此时如果再次访问上篇中的投递异步任务与同步任务于一起的方法exportAsync,即访问如:
http://localhost/project/exportAsync/
就会自动分别记录失败任务与成功任务的条目。
那么接下来刚才task控制器的index方法中分别获取已完成job和未完成job的实现则如:
public function index(){
$failedJobs=FailedJobs::select("uuid")->get();
$finishJobs=FinishJobs::select("uuid")->get();
return Inertia::render('Task/Index', [
'failedJobs' => $failedJobs,
'finishJobs'=>$finishJobs,
]);
}
可以看着我这里又是采用了inertia进行响应。所以前端也要建立如
Y:\root\example-app\resources\js\Pages\Task\Index.vue:
<script setup>
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue';
import {Head} from '@inertiajs/vue3';
const props=defineProps(['failedJobs','finishJobs']);
</script>
<template>
<Head title="Projects" />
<AuthenticatedLayout>
<div class="mt-6 bg-white shadow-sm rounded-lg divide-y">
<h1>未完成job列表</h1>
<ul>
<template v-for="(job,index) in failedJobs">
<li>
<label>uuid:</label>
<span>{{job.uuid}}</span>
</li>
</template>
</ul>
<h1>已完成job列表</h1>
<ul>
<template v-for="(job,index) in finishJobs">
<li>
<label>uuid:</label>
<span>{{job.uuid}}</span>
</li>
</template>
</ul>
</div>
</AuthenticatedLayout>
</template>
<style>
</style>
本期词汇
record 记录,记载
Releasing 释放,放走
Queue (计算机)队列
关键字词:laravel