我在我的cron作业上多次调用不同的api,例如:
foreach ($transactions as $transaction) {
$job = (new SendApplicationToBank($transaction));
$this->dispatch($job);
}
一笔交易有很多银行,所以我向所有银行发送交易:
作业:
public function handle(){
try {
$result = app($bankClass)::sendLoanApplication($this->transaction);
} catch (Exception $e) {
//Silent fail
}
}
问题是它在第一个银行失败并且只是继续重试。
应如何去做,如果一个工作失败,只需重新排队并继续下一个工作?
结果:
答案 0 :(得分:1)
你不应该抓住Exception
让工作失败。现在你正在抓住它,什么都不做(//Silent fail
)
您应该在数据库中创建一个表来自动捕获失败的作业:
php artisan queue:failed-table
在运行队列的脚本中,您应该在失败前添加尝试次数:
php artisan queue:listen --tries=3
添加某种超时也很聪明:
php artisan queue:listen --tries=3 --timeout=60
您还可以通过向作业添加失败的方法来调用失败的webhook:
public function failed()
{
// Called when the job is failing...
}
答案 1 :(得分:0)
运行有限尝试的命令,您可以运行以下命令
php artisan queue:work --retry=3
它会尝试只运行你的工作三次
并以编程方式使用
public $tries = 3;
在你的工作班上
希望这有帮助