2016-03-31 7 views
1

私はlaravel 4.2を使用しているプロジェクトで作業しています。私はBeanstalkキューにジョブを送ります。作業者が実行するジョブを選択すると、そのジョブのIDを取得し、ジョブが失敗した場合にそのジョブをfailed_jobsテーブルに関連付けようとしています。 メソッドから返されたIDは、failed_jobsテーブル内のエントリのIDと決して一致しないという問題があります。Laravel beanstalkジョブIDが一致しません

私は、2つが相関していると考えると予想できます。もしそうでなければ、うまくいけば、誰かが仕事に関係するようにfailed_jobsレコードのIDを取得する方法を手助けすることができます。

+0

独自のIDで作成したジョブに独自のメタ情報を挿入してチェックする方がよいでしょう。 BeanStalkdが返すすべてのIDは、非常に一時的なものになりがちです。 –

答えて

0

は最終的には、ジョブが失敗する原因となった例外、およびfailed_jobsテーブルで作成したエントリとの間の相関関係を作成するための私の解決策は、以下の工程を包含した:

  1. 作成した例外テーブルを作成し、マイグレーションこと例外メッセージ、コード、ファイル、行、およびbeanstalkdジョブIDのフィールドも含まれています。
  2. laravelによって提供されたfailed_jobsスキーマの後にモデル化された移行を作成し、別のフィールド(beanstalkdジョブID)も追加しました。
  3. 独自のQueueServiceProviderを作成し、'queue.failer''queue.worker'サービスを独自の実装でバインドしました。私の 'failer'実装はIlluminate\Queue\Failed\DatabaseFailedJobProviderを拡張し、単にbeanstalkdジョブIDを含む挿入を行うメソッドを追加します。私の 'worker'実装はIlluminate\Queue\Workerを拡張し、logFailedJobメソッドをオーバーライドして、自分の失敗したジョブ挿入メソッドを呼び出す。
  4. app/config/queue.phpには、'failed' => ['database' => 'mysql', 'table' => 'exception_failed_jobs']が含まれており、laravelに 'exception_failed_jobs'という失敗したジョブテーブルを使用するように指示しています。
  5. 私のジョブハンドラコードでは、fireメソッドはビジネスロジックをtry/catchでラップし、例外が発生すると例外がBeanstalkdジョブIDを含む例外テーブルに格納されます。

ここで発生したすべての例外には、ジョブIDを介して失敗したジョブレコードとの相関があります。ビジネスは、ジョブの失敗の原因となった例外を判別し、根本的な問題を修正して失敗したジョブを再試行するか、単にキューから削除するかを決定できるようになりました。私はこのソリューションをテストしましたが、必要なときに正確に動作します。うまくいけば、これは他の人が同じ要件を満たすのに役立ちます。

4.2からこのプロジェクトを最新バージョンに移行するのを待つことはできません。最新のlaravelには既にこの機能が組み込まれていることを理解しています:)

関連する問題