Я использую цепочку заданий и иногда обнаруживаю, что задания запускаются снова. Вот пример моего кода:
<?php
namespace App\Http\Controllers;
use App\Jobs\SendInvoice;
use Illuminate\Http\Request;
use JustIversen\JobChainer\JobChainer;
class NotificationsController extends Controller
{
public function bulk_sending_by_type(Request $request)
{
$numbers = $request->numbers;
$chain = new JobChainer;
foreach ($numbers as $key => $number){
$chain->add(SendInvoice::class, $number);
}
$chain->dispatch();
return response()->json([]);
}
}
Файл задания
<?php
namespace App\Jobs;
use App\Helper\InvoicesHelper;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendInvoice implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 1;
protected $number;
public $queue;
public $timeout = 500;
public function __construct($number )
{
$this->queue = 'invoices';
$this->number = $number;
}
public function handle()
{
InvoicesHelper::send_invoice($this->number);
sleep(30);
}
}
Конфиг
'connections' => [
'sync' => [
'driver' => 'sync',
],
'invoices' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'invoices',
'retry_after' => 520,
],
],
Я использую supervisor для работы с очередью.
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/sites/test.fo/public/artisan queue:work --queue=invoices --tries=1
autostart=true
autorestart=true
user=main
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/sites/test.fo/public/worker.log
stopwaitsecs=9000
Я задал количество попыток с помощью tries, но это не работает. Я также добавил --tries для команды.
И как сказано в документации, чтобы не запускать задания дважды, таймаут должен быть меньше параметра retry_after, что я и сделал. В чем может быть проблема?