我有一个Laravel Scheduled作业,其定义Kernel.php
如下
$schedule->call('\App\Http\Controllers\ScheduleController@processQueuedMessages')
->everyFiveMinutes()
->name('process_queued_messages')
->withoutOverlapping();
Run Code Online (Sandbox Code Playgroud)
在开发过程中,由于语法错误,我的工作引发了异常。我更正了错误并尝试再次执行;但由于某种原因它不会。
我试了artisan down
然后artisan up
。我也尝试过重新启动服务器实例。但是没有任何帮助。作业只是没有执行(也不例外)。
我意识到问题是由于->withoutOverlapping()
。Laravel调度程序以某种方式认为该作业已经在运行,因此不再执行它。
我通过查看供应商代码找到了解决方案。
Illuminate\Console\Scheduling\CallbackEvent.php
Run Code Online (Sandbox Code Playgroud)
它在本地存储中创建一个名为的文件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);
}
Run Code Online (Sandbox Code Playgroud)
删除文件schedule-*
在storage/framework
解决了这个问题。
我也有这个问题。对此没有适当的解决方案,但解决方法可以解决该问题。
转到项目的 storage/framework 文件夹并删除所有文件schedule-***********
。
然后再次尝试运行 cron。即使您使用它也会如此withoutOverlapping() function
。
希望这对你有用。如有疑问请询问。
对于任何阅读此文件的人,自己删除日程表文件不是正确的方法。您需要指定-锁定时间-基于锁定时间,如果没有Overlapping,则会阻止其他任务运行。
如果需要,您可以指定“无重叠”锁到期之前必须经过的分钟数。默认情况下,锁定将在24小时后失效:
您的问题源于以下事实:无重叠应用24小时默认锁。因此,您必须等待24小时才能接受类似的任务。只需根据您的需要调整锁定时间,即可:
$ schedule-> command('emails:send')-> withoutOverlapping(10); //其中10代表分钟