如何为长时间运行的作业|laravel设置自定义retry_after



问题:如何自定义长时间运行的作业,而不在每次重试几秒钟后尝试多次?

我有一份工作需要1到3个小时才能完成,我已经根据laravel文档创建了作业,这是我的作业文件。

<?php

namespace AppModulesCsvJobs;
use AppJobsJob;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use IlluminateSupportFacadesDB;
use IlluminateSupportFacadesStorage;
use IlluminateSupportStr;
use LeagueCsvReader;
use Phone;
/**
* A single excel import job, which can be pushed on to a queue
*/
class UploadCsvDataInTable extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels, Dispatchable,Queueable;
public $timeout = 172800;
/**
* The excel to import
*
* @var AppBulkUpload
*/
protected $csvUpload;
/**
* Create a new job instance.
*
* @param AppFeedImport
*
* @return void
*/
public function __construct(CsvUpload $csvUpload)
{
$this->csvUpload = $csvUpload;
}
public function handle()
{
app(CsvUploadService::class)->uploadCsv($this->csvUpload);
}
}

这里是Laravel文档,用于指定作业的超时。

这是我如何称呼这份工作的代码。

UploadCsvDataInTable::dispatch($csvUpload)->onConnection('redis')->onQueue('low');

我对队列的命令:在主管中工作。

php artisan queue:work --queue=high,low,default --sleep=3 --tries=3

这是我对queue&水平

// horizon.php
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue'      => ['high', 'default', 'low'],
'balance'    => 'simple',
'processes'  => 6,
'tries'      => 3,
],
],
//queue.php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],

我可以看到,在我的工作多次尝试后,在达到3次尝试后,根据地平线配置,它抛出了MaxAttemptsExceededException。

如果我将$timeout增加到24小时,我将在数据库中获得重复记录,因为retry_after多次尝试该作业。

有什么方法可以为这份工作设置自定义重试时间吗?

我为长时间运行的作业创建了另一个连接,它对我来说工作正常。

在horizon.php中为长时间运行的进程创建了新的主管连接

'supervisor-long-running' => [
'connection' => 'redis-long-processes',
'queue' => 'long-running',
'balance' => 'simple',
'processes' => 3,
'tries' => 1,
'timeout' => 86000 // should be shorter than retry_after out
]

和队列中的新redis连接.php

'redis-long-processes' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'long-running',
'retry_after' => 86400,
'block_for' => null,
],

在database.php中,为长时间运行的作业添加了新的队列。

'queue' => [
[
'connection' => 'redis',
'queue'      => ['high', 'default', 'low','long-running'],
'balance'    => 'simple',
'processes'  => 6,
'tries'      => 3,
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],

也不要忘记使用onConnection和onQueue调用作业,以指定应从哪个队列作业执行。

UploadDataInTable::dispatch($upload)->onConnection('redis-long-processes')->onQueue('long-running');

您不需要设置retry_after,您需要将trys设置为1

public $tries = 1;

https://laravel.com/docs/8.x/queues#max-尝试

最新更新