Laravel:如果失败,如何以编程方式运行作业5次?



这是作业的代码,如果失败,我需要在5秒后运行作业仅5次。在深入代码之前,$this->attempts()总是返回1,所以我没有将其包含在代码中。

<?php
namespace ModulesOrderJobs;
use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use ModulesOrderEntitiesOrder;
use ModulesUserEntitiesUser;
class CreditPurchase implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
private $order;
private $user;
private $paid_at;
public function __construct(Order $order, User $user, $paid_at)
{
$this->order = $order;
$this->user = $user;
$this->paid_at = $paid_at;
}

/**
* Execute the job.
*
* @return void
*/
public function handle()
{
try {
$t = 4 / 0;
} catch (Throwable $exception) {
$this->fail();
$this->delete();
$this->release(5);
}
}
}

但是我得到这个错误:

[2021-01-20 23:16:09] local。错误:SQLSTATE[23000]: Integrity constraint violation: 1062 for key 'failed_jobs_uuid_unique' (SQL:insert intofailed_jobs(uuid,connection,queue,payload,exception,failed_at) values (014c3080-3ee3-4198-946c-dfe1d8d858a7, redis, default,){"uuid"014 c3080 - 3 ee3 - 4198 - 946 - c - dfe1d8d858a7","timeout":空,"id":"HDww70Nm2TmRcmeO5cqXN8qrxbvzBfDq","backoff":空,"displayName":"订单模块 工作 CreditPurchase","maxTries":空,"maxExceptions":空,"retryUntil":空,"data":{"command"O: 33:"订单模块 工作 CreditPurchase": 13:{年代:40:" u0000Modules CreditPurchase u0000order&quot工作;;O: 45:"照亮合同 数据库 ModelIdentifier": 4:{: 5:"class"销售:28:"模块订单 Order"实体;销售:2:"id";我:1;销售:9:"relations";答:1:{我:0;销售:5:"items";}: 10:"connection";销售:5:"mysql";}: 39:" u0000Modules CreditPurchase u0000user&quot工作;;O: 45:"照亮数据库合同 ModelIdentifier": 4:{: 5:"class"销售:26:"模块 用户实体User";销售:2:"id";我:1;销售:9:"relations";: 0:{}: 10:"connection"销售:5:"mysql"}: 42:" u0000Modules CreditPurchase u0000paid_at&quot工作;;O: 13:"碳 Carbon": 3:{: 4:"date"销售:26:"2021-01-2023:16:00.344324";销售:13:"timezone_type"我:3;销售:8:"timezone" s: 3:"UTC"}: 3:"job" N, s: 10:"connection" N, s: 5:"queue" N, s: 15:"chainConnection" N, s: 10:"chainQueue" N, s: 19:"chainCatchCallbacks" N, s: 5:"delay"我:2;销售:11:"afterCommit" N, s: 10:"middleware"答:0:{}:7:"chained" 0:{}}","commandName":"模块 CreditPurchase&quot工作;},"job": &照亮QueueCallQueuedHandler@call","attempts":1},照亮QueueMaxAttemptsExceededException: ModulesOrderJobsCreditPurchase尝试次数过多或运行时间过长。该工作可能先前已超时。在C: xampp 根 avakala 供应商 laravel framework src 照亮队列 Worker.php: 713

Jobpublic $tries属性对您有帮助吗?

class CreditPurchase implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 5;
//
}

我们也可以使用基于时间的尝试:

public function retryUntil()
{
return now()->addSeconds(1);
}

另一种方法可能是告诉队列工作器重试它所有的作业5次

php artisan queue:work --tries=5

public $tries = 5public function retryUntil()将优先于命令行提供的——tries值,并且是一种更细粒度的方法

最新更新