如何以静默方式排除失败的排队作业?
How can I troubleshoot silently failing queued jobs?
我有一个分派的作业有两个参数 - 文件的路径和文件名。该作业使用 simplexml 解析该文件,然后在数据库中记录该文件并将该文件移动到适当的文件夹以便妥善保管。如果出现任何问题,它会将文件移动到另一个文件夹以存放失败的文件,并创建一个事件来通知我。
我的问题是有时作业会无提示地失败。作业已从队列中删除,但文件尚未解析,仍保留在同一目录中。 failed_jobs table 为空(我是用数据库队列驱动开发的),failed()
方法没有被触发。我在应用程序服务提供者中放入的 Queue::failing()
方法也没有被触发——我知道,因为它们都只包含一个日志调用来检查它们是否被命中。 Laravel 日志是空的(它是可读的,Laravel 确实会写入其他错误 - 我仔细检查过)相关的系统日志文件也是如此,例如php 的。
一开始以为是超时问题,但是队列监听并没有失败或停止,也没有重启。无论如何,我将超时增加到 300 秒,并验证了侦听器生成的所有“[datetime] Processed: [job]”行都在该时间跨度内。 Php 执行时间等也远远长于此作业所需的时间。
那么,当日志为空、似乎没有任何故障并且我没有收到任何错误通知时,我究竟该如何解决这个问题?如果我排队 200 个文件,那么可能会处理 180 个文件,剩下的 20 个文件会静静地失败。如果我刷新数据库+迁移并再次排队相同的 200,那么可能会处理 182,而 18 将无声地失败 - 但它们不一定相同。
我的句柄方法经过简化以显示相关位,如下所示:
public function handle()
{
try {
$xml = simplexml_load_file($this->path.$this->filename);
$this->parse($xml);
$parsedFilename = config('feeds.parsed path').$this->filename;
File::move($this->path.$this->filename, $parsedFilename);
} catch (Exception $e) {
// if i put deliberate errors in the files, this works fine
$errorFilename = config('feeds.error path').$this->filename;
File::move($this->path.$this->filename, $errorFilename);
event(new ParserThrewAnError($this->filename));
}
}
好吧,所以我仍然完全不知道为什么,但是...在重新启动 VM 之后,我用各种不同的文件和选项测试了八次,并且没有出现零问题。如果有人能猜出原因,请随时回复,如果听起来合理,我会接受你的回答。现在,我会尽快将自己的答案标记为正确,以防其他人稍后偶然发现。
我有一个分派的作业有两个参数 - 文件的路径和文件名。该作业使用 simplexml 解析该文件,然后在数据库中记录该文件并将该文件移动到适当的文件夹以便妥善保管。如果出现任何问题,它会将文件移动到另一个文件夹以存放失败的文件,并创建一个事件来通知我。
我的问题是有时作业会无提示地失败。作业已从队列中删除,但文件尚未解析,仍保留在同一目录中。 failed_jobs table 为空(我是用数据库队列驱动开发的),failed()
方法没有被触发。我在应用程序服务提供者中放入的 Queue::failing()
方法也没有被触发——我知道,因为它们都只包含一个日志调用来检查它们是否被命中。 Laravel 日志是空的(它是可读的,Laravel 确实会写入其他错误 - 我仔细检查过)相关的系统日志文件也是如此,例如php 的。
一开始以为是超时问题,但是队列监听并没有失败或停止,也没有重启。无论如何,我将超时增加到 300 秒,并验证了侦听器生成的所有“[datetime] Processed: [job]”行都在该时间跨度内。 Php 执行时间等也远远长于此作业所需的时间。
那么,当日志为空、似乎没有任何故障并且我没有收到任何错误通知时,我究竟该如何解决这个问题?如果我排队 200 个文件,那么可能会处理 180 个文件,剩下的 20 个文件会静静地失败。如果我刷新数据库+迁移并再次排队相同的 200,那么可能会处理 182,而 18 将无声地失败 - 但它们不一定相同。
我的句柄方法经过简化以显示相关位,如下所示:
public function handle()
{
try {
$xml = simplexml_load_file($this->path.$this->filename);
$this->parse($xml);
$parsedFilename = config('feeds.parsed path').$this->filename;
File::move($this->path.$this->filename, $parsedFilename);
} catch (Exception $e) {
// if i put deliberate errors in the files, this works fine
$errorFilename = config('feeds.error path').$this->filename;
File::move($this->path.$this->filename, $errorFilename);
event(new ParserThrewAnError($this->filename));
}
}
好吧,所以我仍然完全不知道为什么,但是...在重新启动 VM 之后,我用各种不同的文件和选项测试了八次,并且没有出现零问题。如果有人能猜出原因,请随时回复,如果听起来合理,我会接受你的回答。现在,我会尽快将自己的答案标记为正确,以防其他人稍后偶然发现。