代码之家  ›  专栏  ›  技术社区  ›  Ben

作业已尝试多次或运行太长

  •  8
  • Ben  · 技术社区  · 6 年前

    我有一份工作在当地是完美无瑕的,但在生产中我遇到了一些问题。我把整个 handle() try/catch 而且我没有看到任何被记录到Bugsnag中的内容,尽管在其他地方部署了许多其他异常。

    public function handle() {
        try {
    
            // do stuff
    
        } catch (\Exception $e) {
            Bugsnag::notifyException($e);
    
            throw $e;
        }
    }
    

    根据 Laravel Horizon 此队列作业运行于 0.0026001930236816406 但我从来没有看到它工作,也没有看到任何其他错误 failed_jobs

    配置/队列.php

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

    配置/地平线.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;
    

    要查看更多错误消息:

    但这就是我所看到的。

    2 回复  |  直到 6 年前
        1
  •  11
  •   Vaibhavraj Roham    5 年前

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

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

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

        2
  •  5
  •   Yasser    5 年前

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

    请确保“重试时间”值大于运行作业所需的时间

    在里面 配置/队列.php

        'connections' => [
    
        'sync' => [
            'driver' => 'sync',
        ],
    
        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'retry_after' => 9000,
        ],
    
        3
  •  4
  •   Vaibhavraj Roham    5 年前

    根据 documentation ,可以用两种常见方法处理作业失败:

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

    在第一种情况下,可以使用 Queue::failing() Illuminate\Queue\Events\JobFailed 事件作为参数,并且它包含异常。

    handle() 方法。你可以收到 Exception $exception 作为一个参数。

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

    希望这有帮助。