У меня есть работа, которая истекает по времени, и, когда она не выполняется, она отправляет другую, такую же, как она сама, чтобы она могла работать бесконечно и без наложений.Однако не выполненное задание остается в очереди и подвергается повторной попытке, поэтому в конечном итоге у меня запускается более одного задания, которое полностью нарушает цели.
Вот как я справляюсь с ошибкой задания:
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function handle()
{
//infinite websocket listening loop
}
public function failed(Exception $exception)
{
$this::dispatch()->onQueue('long-queue');
$this->delete();
}
$this->delete()
происходит от черты InteractsWithQueue
.Что я делаю не так?
Редактировать: я использую горизонт для запуска заданий, вот конфигурация для пользовательской очереди, установленной в config/horizon.php
'supervisor-long' => [
'connection' => 'redis-long',
'queue' => ['long-queue'],
'balance' => 'simple',
'processes' => 3,
'tries' => 1,
'timeout' => 3600,
],
Задание, которым я являюсьДиспетчеризация - это создание клиента Thruway для подключения к серверу веб-сокетов и подписки на канал для получения обновлений, поэтому я хочу запускать это задание вечно, но в любое время запускать только один экземпляр этого задания.Вот почему я хочу, чтобы он запускался один раз без каких-либо попыток, и как только истекает время ожидания, для отправки другого экземпляра, который будет запущен, и цикл продолжится.Я не мог придумать лучшего способа добиться этого, есть ли другой способ сделать это лучше?