作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:如何自定义长时间运行的作业,而无需在每次 retry_after 秒后尝试多次?
我有一份工作需要 1 到 3 个小时才能完成,我已经基于 laravel 文档创建了作业,这是我的作业文件。
<?php
namespace App\Modules\Csv\Jobs;
use App\Jobs\Job;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use League\Csv\Reader;
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 App\BulkUpload
*/
protected $csvUpload;
/**
* Create a new job instance.
*
* @param App\FeedImport
*
* @return void
*/
public function __construct(CsvUpload $csvUpload)
{
$this->csvUpload = $csvUpload;
}
public function handle()
{
app(CsvUploadService::class)->uploadCsv($this->csvUpload);
}
}
这是 Laravel document为作业指定超时。
这是我如何调用该作业的代码。
UploadCsvDataInTable::dispatch($csvUpload)->onConnection('redis')->onQueue('low');
我的队列命令:在主管中工作。
php artisan queue:work --queue=high,low,default --sleep=3 --tries=3
这是我的队列和地平线配置
// 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,
],
我可以看到,因为 retry_after 我的工作正在尝试多次,并且在达到 3 次尝试后,根据地平线配置,它会抛出 MaxAttemptsExceededException。
如果我将 $timeout 增加到 24 小时,我会在我的数据库中得到重复的记录,因为 retry_after 会多次尝试该作业。
有什么方法可以为这项工作设置自定义 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
]
和queue.php中的新redis连接
'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');
关于laravel - 如何为长时间运行的作业设置自定义 retry_after |拉维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63816367/
问题:如何自定义长时间运行的作业,而无需在每次 retry_after 秒后尝试多次? 我有一份工作需要 1 到 3 个小时才能完成,我已经基于 laravel 文档创建了作业,这是我的作业文件。 c
我是一名优秀的程序员,十分优秀!