php 如何检查作业是否已用尽所有重试

a2mppw5e  于 2023-05-05  发布在  PHP
关注(0)|答案(1)|浏览(132)

假设我有一个调用某个作业的实体
就像当一个付款完成我想生成一个PDF卡的付款,所以

$payment = Payment::create([....]);
PaymentJob::dispatch($payment);

如果此作业失败或成功,我希望将状态(我有PaymentStatus模型)附加到付款
所以在我的工作中

public function handle()
 {
    // generate pdf 
    $pyament->Status()->create(['status'=>'success']);
 }
 
 public function failed(Throwable $exception)
 {
    $pyament->Status()->create(['status'=>'error']);
 }

问题是每次付款应该只有1个状态成功或错误
如果我有3个重试每个作业在我的队列设置和作业前2个失败,最后一个成功,我将有3个不同的状态付款
基本上我想我的失败状态只会被创建,如果所有3次尝试都失败了,作业不再被处理

wljmcqd8

wljmcqd81#

解决此问题的一种方法是使用标记来跟踪作业的付款状态。
1.调度PaymentJob时,请在付款上设置一个标志,以指示该作业处于挂起状态:
$payment = Payment::create([...]);$payment-〉status()-〉create(['status' =〉'pending']);paymentJob::dispatch($payment);
1.在PaymentJob的handle()方法中,更新付款状态以指示作业正在处理:
public function handle(){ $payment = $this-〉payment;$payment-〉status()-〉update(['status' =〉'processing']);

// generate pdf 
 try {
     // ...
     $payment->status()->update(['status' => 'success']);
 } catch (Exception $e) {
     throw new PaymentFailedException();
 }

}
1.在PaymentJob的failed()方法中,仅在作业三次重试均失败时更新付款状态以指示作业失败:
public function failed(Throwable $exception){ $payment = $this-〉payment;

if ($this->attempts() >= $this->tries) {
     $payment->status()->update(['status' => 'error']);
 }

}

相关问题