私はローカルで問題なく動作する仕事を持っていますが、本番環境では動作しない問題に遭遇します。 handle()
全体をtry/catch
で網羅しましたが、他の多くの例外が展開されているにもかかわらず、Bugsnagに記録されたものは何もありません。
public function handle() {
try {
// do stuff
} catch (\Exception $e) {
Bugsnag::notifyException($e);
throw $e;
}
}
Laravel Horizon によると、このキュージョブは0.0026001930236816406
秒間実行され、このジョブに関連するため、failed_jobs
テーブルで動作せず、他のエラーも表示されません。
config/queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => (60 * 10), // 10 minutes
'block_for' => null,
],
config/horizon.php
'environments' => [
'production' => [
'supervisor' => [
'connection' => 'redis',
'queue' => [
'default',
],
'balance' => 'auto',
'processes' => 10,
'tries' => 3,
// 10 seconds under the queue's retry_after to avoid overlap
'timeout' => (60 * 10) - 10, // Just under 10 mins
],
何かがこのジョブを何度も再試行させる原因になっている場合、どうすれば見つけることができますか?私は迷っています。
これまでの調査
SELECT DISTINCT exception, COUNT(id) as errors
FROM failed_jobs
WHERE payload LIKE '%[TAG-JOB-HAS]%'
GROUP BY exception;
このエラーメッセージ以外のものを表示するには:
ジョブの試行回数が多すぎるか、実行時間が長すぎます
しかし、それは私が見るすべてです。
Laravelによって指定された失敗したメソッドで例外をキャッチしよう
/**
* The job failed to process.
*
* @param Exception $exception
* @return void
*/
public function failed(Exception $exception)
{
// Send user notification of failure, etc...
}
そして、ローカルのデフォルトキュードライバが同期されているかどうかを確認してから、その予想される動作を確認します。
documentation によると、次の2つの一般的な方法でジョブの失敗を処理できます。
failed()
メソッドを使用します。最初のケースでは、Queue::failing()
メソッドを使用してすべてのジョブを処理できます。 _Illuminate\Queue\Events\JobFailed
_イベントをパラメーターとして受け取りますが、例外が含まれています。
別のケースでは、failed()
メソッドを使用できます。handle()
メソッドの近くに配置する必要があります。 _Exception $exception
_をパラメーターとして受け取ることもできます。
例:
_public function failed(\Throwable $exception)
{
// Log failure
}
_
お役に立てれば。
同じ問題があった
「retry_after」パラメーターを増やして修正しました
retry_after値が、ジョブの実行にかかる時間よりも大きいことを確認してください
config/queue.phpファイル
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 9000,
],