在添加和运行另一个任务之前检查调度程序任务的状态

时间:2019-08-22 19:32:07

标签: laravel laravel-scheduler

我对laravel框架中的任务计划有疑问。我已经在控制台命令列表中定义了命令currency:updatecurrency:archive。现在,我要在schedule方法中运行这两个命令,但要满足以下条件:

如果这是运行currency:archive命令的时间,请在上一个命令(即currency:update)结束之前不要运行其他命令currency:archive;否则,请运行currency:update命令。

这是我当前的计划方法代码:

$schedule->command('currency:archive')
         ->dailyAt('00:00')
         ->withoutOverlapping();

$schedule->command('currency:update')
         ->everyMinute()
         ->withoutOverlapping();

我应该如何修改它?

谢谢。

2 个答案:

答案 0 :(得分:1)

在laravel时间表文档中,提到了以下两个功能:

  1. 真相测试约束docs
$schedule->command('emails:send')->daily()->skip(function () {
    return true;
});
  1. 任务挂钩docs
$schedule->command('emails:send')
         ->daily()
         ->before(function () {
             // Task is about to start...
         })
         ->after(function () {
             // Task is complete...
         });

您可以考虑在$achriveCommandIsRunning闭包中将类似before()的变量设置为true。在skip()闭包中,您可以return $archiveCommandIsRunning;;在after()闭包中,您可以再次将变量设置回false。

答案 1 :(得分:1)

谢谢

我按照您所说的修改了代码,现在可以使用了。 这是最终代码:

$isArchiveCommandRunning = false;
$schedule->command('currency:archive')
    ->dailyAt('00:00')
    ->before(function () use (&$isArchiveCommandRunning) {
        $isArchiveCommandRunning = true;
    })
    ->after(function () use (&$isArchiveCommandRunning) {
        $isArchiveCommandRunning = false;
    })
    ->withoutOverlapping();

$schedule->command('currency:update')
    ->everyMinute()
    ->skip(function () use (&$isArchiveCommandRunning) {
        return $isArchiveCommandRunning;
    })
    ->withoutOverlapping();