我有一個用兩個參數 - 路徑和文件名分派到文件的作業。作業使用simplexml解析文件,然後在數據庫中註明它並將文件移動到適當的文件夾中以便妥善保管。如果出現任何問題,它會將文件移動到另一個文件夾以查找失敗的文件,並創建一個事件以通知我。如何排除故障的排隊作業?
我的問題是,有時候這個工作會默默地失敗。該作業將從隊列中移除,但該文件尚未被解析並保留在同一目錄中。 failed_jobs表爲空(我正在使用數據庫隊列驅動程序進行開發),並且failed()
方法尚未觸發。我放入應用服務提供商的Queue::failing()
方法也沒有被觸發 - 我知道,因爲這兩種方法都只包含一個日誌調用來檢查它們是否被擊中。 Laravel日誌是空的(它是可讀的,並且Laravel確實寫入了其他錯誤 - 我再次檢查),相關的系統日誌文件也是如此,例如, PHP的。
起初我以爲這是一個超時問題,但隊列偵聽器沒有失敗或停止,也沒有重新啓動。無論如何,我將超時時間增加到了300秒,並且驗證了聽者所產生的所有「[datetime] Processed:[job]」線都在該時間範圍內。 Php的執行時間等也比這份工作要求的時間長得多。
那麼,當日志是空的,沒有任何東西看起來失敗,我怎麼能解決這個問題,我不知道什麼是錯的?如果我排隊了200個文件,那麼可能會處理180個文件,其餘20個文件會自動失敗。如果我刷新數據庫+遷移並再次排隊同一個200,那麼可能會處理182個數據庫,並且18個將無提示地失敗 - 但它們不一定是相同的。
我handle方法,簡化來展示相關的位,如下所示:
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));
}
}