Задать вопрос

Как правильно организовать очередь с условием?

Не совсем понимаю как это организовать: необходимо отправить запрос на URL, и если пришёл код ответа != 200, то попытаться ещё раз через пять минут, и так в течение часа?

Можно ли в методе handle() класса App\Jobs\MakeRequest.php проверять статус, и ещё раз выполнять задание?

Вроде такого:
fucntion handle()
{
  $response = Http::post($this->url, $this->data);
  if ($response->failed()) {
    self::dispatch($this->url, $this->data)->delay(now()->addMinutes(5));
  }
}


или надо так?

fucntion handle()
{
  $response = Http::post($this->url, $this->data);
  if ($response->failed()) {
    $this->release(360);
  }
}


Или же это надо делать как-то иначе?
  • Вопрос задан
  • 431 просмотр
Подписаться 6 Простой 4 комментария
Решения вопроса 1
iNickolay
@iNickolay Автор вопроса
Вообщем, решение, как я и предполагал, простое:

В классе необходимо указать $tries, а вместо исключения вызывать $this->release()

В спойлере код класса:
Job class
class MyQueueJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    const TIMEOUT = 10;

    public $tries= 288;

    public $url;

    public $data;

    public function __construct(string $url, $data)
    {
        $this->onQueue('myqueue');

        $this->url = $url;
        $this->data = $data;
    }

    public function handle()
    {
        try {
            $response = Http::withOptions(['verify' => false])
                ->timeout(self::TIMEOUT)
                ->post($this->url, [$this->data]);
        } catch (\Exception $exception) {
            $this->release(300);
        }

        if (isset($response) && $response->failed()) {
            $this->release(300);
        }
    }
}

Команда, выполняемая в supervisor`e:

command=php /laravel/artisan queue:work --queue=myqueue
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
ну можно в параметры передавать предельную дату попыток, при ошибке откладывать через https://laravel.com/docs/8.x/queues#manually-relea... при старте проверять дату, и если она просрочена, то https://laravel.com/docs/8.x/queues#manually-faili...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы