如何对无声排队的作业进行故障排除?

时间:2016-08-23 08:59:48

标签: laravel laravel-5.2 jobs

我有一个用两个参数调度的作业 - 文件的路径和文件名。作业使用simplexml解析文件,然后在数据库中通知它并将文件移动到相应的文件夹以便妥善保管。如果出现任何问题,它会将文件移动到另一个文件夹以查找失败的文件,并创建一个事件以通知我。

我的问题是有时工作会无声地失败。作业将从队列中删除,但该文件尚未解析,并且仍保留在同一目录中。 failed_jobs表为空(我使用数据库队列驱动程序进行开发)并且尚未触发Queue::failing()方法。我在应用服务提供商中放置的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)); } } 方法也没有被触发 - 我知道,因为这两个方法只包含一个日志调用来检查它们是否被命中。 Laravel日志是空的(它是可读的,Laravel会为其他错误写入它 - 我仔细检查过)以及相关的系统日志文件,例如, PHP' S

起初我认为这是一个超时问题,但队列侦听器没有失败或停止,也没有重新启动。无论如何,我将超时时间增加到300秒,并验证所有" [datetime]已处理:[作业]"听众生成的行在那个时间段内。 Php执行时间等也远远超过此工作所需的时间。

那么,当日志为空,没有任何东西出现故障时,我怎么能解决这个问题,而且我没有得到什么错误的通知?如果我排队200个文件,则可能会处理180个文件,剩下的20个文件将无提示失败。如果我刷新数据库+迁移并再次排队相同的200,则可能会处理182并且18将无声地失败 - 但它们不一定是相同的。

我的句柄方法,简化为显示相关位,如下所示:

@RequestMapping(value = "/registrationConfirm", method = RequestMethod.POST)
public @ResponseBody
String getAttr(@RequestParam(value="token") String id) {
  System.out.println(id);
  return id;
}

1 个答案:

答案 0 :(得分:0)

好的,所以我仍然完全不知道为什么,但是......重新启动VM后我已经使用各种不同的文件和选项测试了八次,并且没有问题。如果有人能猜出原因,请随时回复,如果听起来合理,我会接受你的回答。现在,我可以尽可能地将自己的答案标记为正确,以防其他人偶然发现这一点。

相关问题