一、前言
- 在前面的文章 Lumen实例讲解:第一部分 中,简单的介绍了 Lumen定时任务系统 的项目结构以及接口数据结构。将会在后面的文章陆续地讲解接口的实现逻辑。
- 我们先来重温一下整个 定时任务系统 的核心模块:
二、开始
- 最先要给各位讲解的是,此项目最为重要的模块 Task Module。本模块实现的功能如下:
* 添加定时任务 => api/task/add => TaskService.addOne() => 普通管理员
* 查询定时任务 => api/task/seek => TaskService.seekOne() => 普通管理员|超级管理员
* 定时任务列表 => api/task/all => TaskService.listAll() => 普通管理员|超级管理员
* 删除定时任务 => api/task/del => TaskService.delOne() => 超级管理员
复制代码
看起来貌似只是单纯的 CURD 操作?实际上在本项目,在 Lumen 框架下,一些问题任然值得我们重视:
- 《 Lumen 开箱的队列功能,当队列中的 Job被消费之后,会移除所有数据 》。
- 在本项目中的解决思路是:通过自定义的
TaskDispatch
,在TaskDispatch.__destruct()
魔术方法中备份队列中任务数据到tb_jobs
表中,同时更新对应的tb_tasks
表的tb_job_id
字段。$queueId = app(Dispatcher::class)->dispatch($this->job); $queue = DB::table(config('queue.connections.database.table')) ->where('id', $queueId)->first(); $this->job->getJobInstance()->update([ 'payload' => $queue->payload, 'queue' => $queue->queue ]); $this->job->getTaskInstance()->update([ 'tb_job_id' => $this->job->getJobInstance()->job_id ]); 复制代码
- 在本项目中的解决思路是:通过自定义的
- 《从
tb_tasks
表设计中不难得知,在记录定时任务数据的同时,需要同时保存tb_jobs
表的主键ID和tb_users
表的主键ID》- 在前一个问题中其实已经解决了
tb_job_id
字段的来源。同时在 Task Module 中的TaskJob
的TaskJob.setTaskInstance()
方法,初始化TaskModel
时就已经指定了tb_user_id
字段数据。$taskContent = json_encode(Arr::except($this->taskData, ['task_title'])); $filled = [ 'task_uuid' => md5($taskContent . time()), 'task_content' => $taskContent, 'task_title' => $this->taskData['task_title'], 'tb_user_id' => $this->taskData['tb_user_id'] ]; $this->taskInstance = (new TaskModel)->createOne($filled); 复制代码
- 在前一个问题中其实已经解决了
- 跟 Task Module 息息相关的 Job Module 就非常简单了,仅仅只有
JobModel
一个文件,该模块存在的意义就是 备份所有进入队列消费的任务信息 作为一种日志形式保留在数据库中。 - 诚然,单纯的通过上述的代码片段,还是无法理解意图,所以在本文最后,在下建议新手读者可以去查看框架中以下文件的源码:
\Illuminate\Contracts\Bus\Dispatcher => 框架发布Job到队列的类
\Illuminate\Contracts\Queue\Job => 实现Job接口的有DatabaseJob、RedisJob等
复制代码
- 剩下的模块将会在后续文章中一一讲解。给出最新完整项目的 代码仓库 。
三、结语
- 本教程面向新手,整个系列包含 Lumen实例讲解:第一部分 以及会在近期推出的 Lumen实例讲解:第三部分 。
- 随着系统升级,软件更新,以后的配置可能有所变化,在下会第一时间测试并且更新教程;
- 欢迎联系在下,讨论建议都可以,之后会发布其它的教程。
- 后面紧锣密鼓地将会推出 Laravel业务篇 系列的教程,敬请期待。