Я кодировал Laravel 6 лет назад, и теперь мне приходится иметь дело с ситуацией, когда пользователь может установить время ожидания очереди, потому что есть длительный процесс, который должен завершиться ошибкой в соответствии с временем ожидания пользователя.
class MyQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $userTimeout;
public function __construct($userTimeout)
{
$this->userTimeout = $userTimeout;
}
public function handle()
{
MyService::compute(); // very heavy process (hypotethically)
// the queue needs to fail if the above computation exceeds the $userTimeout.
// this following code won't run logically before the above code finishes
if ($userTimeoutIsReached) {
$this->fail();
}
}
}
Мне нужно иметь возможность сделать это из контроллера
MyQueue::dispatch(request()->userTimeout);
Нужны некоторые мысли от вас, ребята, чтобы понять суть этого. Я застрял. Пожалуйста помоги
Laravel уже имеет свойство тайм-аута в своем классе заданий.
просто измените userTimeout
на timeout
как их документацию
А также, если вы хотите пометить как неудачный после тайм-аута, просто добавьте свойство failOnTimeout
.
Таким образом, окончательный код должен выглядеть так:
class MyQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $timeout = 120; //default timeout
public $failOnTimeout = true;
public function __construct($userTimeout)
{
$this->timeout = $userTimeout;
}
public function handle()
{
MyService::compute(); // very heavy process (hypotethically)
}
}
не работает. Я попытался смоделировать это с помощью while(true) { $i++; dump($i); sleep(1); }
, он продолжает работать, не выходит из строя
@mending3 Я проверил, и это сработало на 100%. какую версию laravel вы используете? а также какая связь?
у вас есть пример репозитория github? Laravel 9, DATABASE
подключение к очереди
Я использовал код, который написал в своем ответе, и он сработал на 100%. Вероятность того, что вы не сработали, request()->userTimeout
вернула 0, поэтому она не ограничена. Или другая возможность: вы использовали команду queue:listen
вместо queue:work
. Вы должны использовать queue:work
для работника очереди.
ах да. это работает. Я запускаю это на докере, и я не устанавливал расширение pcntl в службе супервизора на docker-compose.yml. Спасибо