Работа была предпринята слишком много раз или слишком долго - PullRequest
0 голосов
/ 31 октября 2018

У меня есть работа, которая работает безупречно локально, но на производстве я сталкиваюсь с проблемами, когда она не работает. Я охватил весь handle() с помощью try/catch и не вижу ничего зарегистрированного в Bugsnag, несмотря на множество других исключений в других местах от развертывания.

public function handle() {
    try {

        // do stuff

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

        throw $e;
    }
}

Согласно Laravel Horizon это задание очереди выполняется в течение 0.0026001930236816406 секунд, и я никогда не вижу его работающим и никогда не вижу никаких других ошибок в таблице failed_jobs, поскольку это относится к этому заданию.

конфиг / queue.php

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

конфиг / 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;

Чтобы увидеть больше, чем это сообщение об ошибке:

Задание было выполнено слишком много раз или слишком долго

но это все, что я вижу.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

В соответствии с документацией вы можете справиться с ошибками в работе двумя способами:

  • с использованием событий сбоя задания
  • с использованием метода failed().

В первом случае вы можете обрабатывать все задания, используя метод Queue::failing(). Вы получите Illuminate\Queue\Events\JobFailed событие в качестве параметра, и оно содержит исключение.

В другом случае вы можете использовать метод failed(), он должен находиться рядом с вашим методом handle(). Вы также можете получить Exception $exception в качестве параметра.

Пример: * * один тысяча двадцать-одна

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

Надеюсь, это поможет.

0 голосов
/ 11 июля 2019

У меня была такая же проблема

Я исправил это, увеличив параметр retry_after

убедитесь, что значение retry_after больше, чем время, необходимое для выполнения задания

в config / queue.php file

    'connections' => [

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

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 9000,
    ],
0 голосов
/ 06 ноября 2018

Попробуйте перехватить исключение в методе сбоя, заданном laravel

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

и проверьте, синхронизирован ли ваш драйвер очереди по умолчанию в локальной сети, а затем ожидаемое поведение.

...