は最終的には、ジョブが失敗する原因となった例外、およびfailed_jobs
テーブルで作成したエントリとの間の相関関係を作成するための私の解決策は、以下の工程を包含した:
- 作成した例外テーブルを作成し、マイグレーションこと例外メッセージ、コード、ファイル、行、およびbeanstalkdジョブIDのフィールドも含まれています。
- laravelによって提供されたfailed_jobsスキーマの後にモデル化された移行を作成し、別のフィールド(beanstalkdジョブID)も追加しました。
- 独自のQueueServiceProviderを作成し、
'queue.failer'
と'queue.worker'
サービスを独自の実装でバインドしました。私の 'failer'実装はIlluminate\Queue\Failed\DatabaseFailedJobProvider
を拡張し、単にbeanstalkdジョブIDを含む挿入を行うメソッドを追加します。私の 'worker'実装はIlluminate\Queue\Worker
を拡張し、logFailedJob
メソッドをオーバーライドして、自分の失敗したジョブ挿入メソッドを呼び出す。
app/config/queue.php
には、'failed' => ['database' => 'mysql', 'table' => 'exception_failed_jobs']
が含まれており、laravelに 'exception_failed_jobs'という失敗したジョブテーブルを使用するように指示しています。
- 私のジョブハンドラコードでは、fireメソッドはビジネスロジックをtry/catchでラップし、例外が発生すると例外がBeanstalkdジョブIDを含む例外テーブルに格納されます。
ここで発生したすべての例外には、ジョブIDを介して失敗したジョブレコードとの相関があります。ビジネスは、ジョブの失敗の原因となった例外を判別し、根本的な問題を修正して失敗したジョブを再試行するか、単にキューから削除するかを決定できるようになりました。私はこのソリューションをテストしましたが、必要なときに正確に動作します。うまくいけば、これは他の人が同じ要件を満たすのに役立ちます。
4.2からこのプロジェクトを最新バージョンに移行するのを待つことはできません。最新のlaravelには既にこの機能が組み込まれていることを理解しています:)
独自のIDで作成したジョブに独自のメタ情報を挿入してチェックする方がよいでしょう。 BeanStalkdが返すすべてのIDは、非常に一時的なものになりがちです。 –