Как сделать так, чтобы задание Laravel завершилось неудачно без перезапуска, чтобы я мог использовать часовой для регистрации исключения? - PullRequest
0 голосов
/ 06 апреля 2020

В своем многосерверном приложении я использую систему очередей laravel для запуска фоновых заданий. Иногда в своей логике c я хочу, чтобы моя работа выдавала исключение, чтобы я мог регистрировать его через часового, используя laravel библиотеку , которая предлагает.

Так в моей работе :

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

use App\Model\Etable\User;
use App\Model\User;

class MyJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;

    /**
     * @var int
     */
    private $user_id;


    /**
     * @param int   $user          The user that has opted or deopted for newsletter consent
     */
    public function __construct(int $id)
    {
        $this->user_id = $user_id;
    }


    public function handle(): void
    {  
        /**
         * @var User
         */
        $user=User::useWritePdo()->find($this->user_id);

        if(empty($user)){
            throw new \Exception("No such a user with user id: {$this->user_id}");
        }

        // Rest of logic here
    }
}

Как только возникнет исключение, я буду зарегестрирован в часовом, но он также будет возобновляться, поскольку логика laravel c для заданий должна это делать.

В моем случае я считаю ненужным тратить ресурсы на повторное порождение MyJob в случае, если у пользователя нет значения для продолжения, потому что сам лог c не может быть выполнен в случае, если нет пользователь существует С другой стороны, при любой другой ошибке я хочу, чтобы моя работа продолжала повторяться до тех пор, пока я не смогу успешно запустить ее снова.

Итак, как я могу заставить свою работу не возродиться при указанных c ошибках? Еще лучше было бы также, если бы я мог использовать метод ведения журнала по умолчанию, который laravel предлагает для произвольной регистрации ошибки и в часовом режиме через выделенный часовой канал.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Лучший и более простой подход - когда код не может проверить, сколько раз уже выполнено:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

use App\Model\Etable\User;
use App\Model\User;

class MyJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;

    /**
     * @var int
     */
    private $user_id;


    /**
     * @param int   $user          The user that has opted or deopted for newsletter consent
     */
    public function __construct(int $id)
    {
        $this->user_id = $user_id;
    }


    public function handle(): void
    {  
        /**
         * @var User
         */
        $user=User::useWritePdo()->find($this->user_id);

        if(empty($user)){
            if ($this->attempts() > 1) { 
             return; 
            }
            throw new \Exception("No such a user with user id: {$this->user_id}");
        }

        // Rest of logic here
    }
}

Это достигается с помощью:

if ($this->attempts() > 1) { 
 return; 
}

Таким образом, вы бросить один раз исключение, исключение регистрируется в Sentry, а затем во второй раз, когда оно будет выполнено, оно просто выйдет и никогда не возродится.

0 голосов
/ 06 апреля 2020

Обратите внимание, что сбойные задания не будут перезапущены, если вы не запустите явно

php artisan queue:failed

. Вы можете сгенерировать исключение и обработать его в методе загрузки AppServiceProvider, удалив задание чтобы избежать дальнейших попыток. См. документацию о том, как это сделать.

...