任务调度如何从数据库内进行读取!!! 跪求方案,写完立马开源

我想做一个任务调度系统,想把所有的调度任务放在数据库中。然后在Kernel.php用数据库进行读取循环,然后去执行调度,我目前测试执行exec命令没有问题,但是要根据数据库配置的是否后台运行,是否避免任务重复运行来进行执行的话就不知道怎么做了。

下面的直接执行命令是没有任何问题。

    protected function schedule(Schedule $schedule)
    {
        //调用模型对象
        $objSchedule  = new \App\Models\Schedule();
        //获取全部的调度任务
        $objSchedules = $objSchedule->all();

        foreach ($objSchedules as $objSchedule) {
            $schedule->exec($objSchedule->command);
        }
    }

但是数据库中还有其他的配置,如后台执行,避免任务重复执行,等如

CREATE TABLE `schedules` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称',
  `frequency` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '执行频率',
  `command` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '执行的 Shell 命令',
  `is_locked` tinyint(1) NOT NULL DEFAULT '1' COMMENT '任务是否上锁,以防止重复执行(1 表示锁定,0 表示未锁定)',
  `lock_duration` tinyint(1) DEFAULT NULL COMMENT '任务上锁的时间(以小时为单位)',
  `is_sequential` tinyint(1) NOT NULL COMMENT '任务是否按顺序执行0按照顺序 1多线程',
  `status` tinyint(1) DEFAULT '1' COMMENT '任务状态0暂停运行  1开启运行',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='调度列表';

然后我想根据 is_locked 加上->withoutOverlapping()
根据 is_sequential 加上->runInBackground()

这个判断语句怎么加入到这个代码中呢,不会写啊

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
翟宇鑫
1年前 评论
liuhaiqiang999 (楼主) 1年前
讨论数量: 4
翟宇鑫
1年前 评论
liuhaiqiang999 (楼主) 1年前

status 字段标识任务状态,加一个version 用来做乐观锁。

1年前 评论

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