Laravel非重叠计划作业未执行

kyvafyod  于 2022-12-05  发布在  其他
关注(0)|答案(6)|浏览(223)

我有一个Laravel调度作业,它在Kernel.php中定义如下

$schedule->call('\App\Http\Controllers\ScheduleController@processQueuedMessages')
    ->everyFiveMinutes()
    ->name('process_queued_messages')
    ->withoutOverlapping();

在开发过程中,我的作业由于语法错误而引发了一个异常。我纠正了这个错误并尝试再次执行它;但由于某种原因它不会。
我尝试了artisan down,然后是artisan up。我还尝试重新启动服务器示例。但没有任何帮助。作业没有得到执行(也没有例外)。
我意识到问题是由于->withoutOverlapping()。不知何故,Laravel调度程序认为作业已经在运行,因此不再执行它。

v440hwme

v440hwme1#

我通过查看供应商代码找到了解决方案。

Illuminate\Console\Scheduling\CallbackEvent.php

它在本地存储中创建一个名为schedule-*的文件。

public function withoutOverlapping()
{
    if ( ! isset($this->description))
    {
        throw new LogicException(
            "A scheduled event name is required to prevent overlapping. Use the 'name' method before 'withoutOverlapping'."
        );
    }

    return $this->skip(function()
        {
            return file_exists($this->mutexPath());
        });
}

protected function mutexPath()
{
    return storage_path().'/framework/schedule-'.md5($this->description);
}

删除storage/framework处的文件schedule-*解决了问题。

xmd2e60i

xmd2e60i2#

**对于阅读本文的任何人来说,自己删除计划文件并不是正确的方法。**您需要指定锁定时间,根据该时间,withoutOverlapping可以防止更多任务运行。

Laravel - Task Scheduling中所引用
如果需要,您可以指定在“无重叠”锁定过期之前必须经过的分钟数。默认情况下,锁定将在24小时后过期:
您的问题是由于withoutOverlapping应用了24小时的默认锁定。因此,您必须等待24小时才能接受类似的任务。只需根据您的需要调整锁定时间,方法是:
(10)在发送电子邮件时,不需要重叠;//其中10表示分钟

gwbalxhn

gwbalxhn3#

这对我来说很管用:

php artisan cache:clear
bqjvbblv

bqjvbblv4#

我也有这个问题。没有一个适当的解决方案,但变通方案将解决这个问题。
转到项目的storage/framework文件夹并删除所有schedule-***********文件。
然后再次尝试运行cron。即使您使用withoutOverlapping() function,它也会运行。
希望这对你有用。如果有任何疑问,请询问。

dluptydi

dluptydi5#

这周我们遇到了这种情况,我们认为我们找到了原因。我们的cron运行了生产服务器的一个站点文件夹。我们的部署过程涉及到第二个文件夹,我们在其中进行部署/构建,然后在最后进行热文件夹交换。()可能必须在进程完成时更新schedule-* 文件中的一行,该文件夹可能在作业中被交换,cron无法在正确的schedule-* 文件中成功地将作业标记为已完成,因此它认为该作业仍在运行/卡住。
这种情况很少发生,但我们将添加一个命令,在部署后清除这些文件,这样就不会再次发生这种情况。

thtygnil

thtygnil6#

从laravel 8.x开始,您可以使用specific command来清除互斥锁文件,例如,如果在执行任务时由于服务器重新启动而导致任务阻塞
clear:cache的问题是,该命令清除整个应用程序的缓存,而该命令只清除互斥文件

php artisan schedule:clear-cache

相关问题