2015-11-29 4 views
2

Я использовал laravel 5.1 Очередь для моей функции фона с асинхронным режимом. Но я хочу запустить эту функцию только один раз. Если эта функция не работает, я хочу сделать другой процесс. Как я могу обнаружить, что моя работа потерпела неудачу или нет? Я делаю правильно или неправильно? Что я должен изменить? ps: Я новичок. Я использовал это в своем контроллере.Как я могу запустить Laravel Queue только один раз?

$job = new myjob($var1, $var2); 
$this->dispatch($job); 
$job->release(); 
if ($job->attempts() >= 1) 
{ 
    $job->delete(); 
    //will do other process 
} 
+0

Если вы хотите, чтобы ждать работы и только ** тогда ** делать другое - почему бы запустить его асинхронной в первую очередь? – Timofey

+0

Я буду делать другой процесс только тогда, когда моя работа не удастся. И я использую работу в качестве фоновой функции. Потому что эта функция имеет множество процессов завивки и базы данных. Мне нужно подождать не менее 7 секунд, чтобы закончить это. Вот почему я использую работу. –

ответ

3

Вы должны использовать --tries параметр с 1 значением, например:

php artisan queue:work --tries=1 

Это будет работать каждую задачу только один раз и не повторять его в случае неудачи.

+0

Я не могу использовать консоль на моем хостинге. Не могу ли я сделать это в контроллере? –

0

если у вас есть проблемы с доступом к консоли, вы можете определить попытки в контроллере:

<?php 

namespace App\Jobs; 

class ProcessPodcast implements ShouldQueue 
{ 
    /** 
    * The number of times the job may be attempted. 
    * 
    * @var int 
    */ 
    public $tries = 5; 
} 

Ссылка: https://laravel.com/docs/5.4/queues#max-job-attempts-and-timeout

И на основе того, что вы хотите достичь, я предлагаю вам использовать событие Queued Слушатель.

https://laravel.com/docs/5.4/events#queued-event-listeners

Я надеюсь, что помощь :)