25

我有一份在本地工作完美的工作,但在生产中我遇到了它不起作用的问题。handle()尽管在其他地方部署了许多其他例外,但我已经用 a包含了整个内容,try/catch并且没有看到任何记录到 Bugsnag 的内容。

public function handle() {
    try {

        // do stuff

    } catch (\Exception $e) {
        Bugsnag::notifyException($e);

        throw $e;
    }
}

根据Laravel Horizo​​n的说法,这个队列作业运行了0.0026001930236816406几秒钟,我从来没有看到它工作过,也从来没有在failed_jobs表中看到与这个作业相关的任何其他错误。

配置/队列.php

    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => 'default',
        'retry_after' => (60 * 10), // 10 minutes
        'block_for' => null,
    ],

配置/horizo​​n.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 Horizo​​n的仪表板显示有问题的作业运行时间 < 1 秒,所以我知道它实际上并没有超时。
4

3 回答 3

19

尝试在 laravel 给出的失败方法中捕获异常

/**
* The job failed to process.
*
* @param  Exception  $exception
* @return void
*/
public function failed(Exception $exception)
{
    // Send user notification of failure, etc...
}

并检查您在本地的默认队列驱动程序是否同步,然后是其预期行为。

于 2018-11-06T13:32:18.853 回答
18

我有同样的问题

我通过增加“retry_after”参数来修复它

确保 retry_after 值大于运行作业所需的时间

config/queue.php文件中

    'connections' => [

    'sync' => [
        'driver' => 'sync',
    ],

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 9000,
    ],
于 2019-07-11T10:25:07.287 回答
6

根据文档,您可以通过两种常见方式处理作业失败:

  • 使用失败的作业事件
  • 使用failed()方法。

在第一种情况下,您可以使用Queue::failing()方法处理所有工作。您将收到Illuminate\Queue\Events\JobFailed事件作为参数,它包含异常。

在另一种情况下,您可以使用failed()方法,它应该放在您的handle()方法附近。您也可以Exception $exception作为参数接收。

例子:

public function failed(\Throwable $exception)
{
    // Log failure
}

希望这可以帮助。

于 2018-11-09T22:39:17.170 回答