我在我的 cron 工作中多次调用不同的 api,例如:
foreach ($transactions as $transaction) {
$job = (new SendApplicationToBank($transaction));
$this->dispatch($job);
}
Run Code Online (Sandbox Code Playgroud)
一笔交易有许多银行,所以我向所有相关银行发送一笔交易:
工作:
public function handle(){
try {
$result = app($bankClass)::sendLoanApplication($this->transaction);
} catch (Exception $e) {
//Silent fail
}
}
Run Code Online (Sandbox Code Playgroud)
问题是它在第一家银行上失败了,只是不断重试。
应该如何去配置,以便如果一项作业失败,只需释放回队列并继续下一项?
结果:
你不应该抓住Exception让工作正常失败的原因。现在你抓住了它,什么都不做 ( //Silent fail)
您应该在数据库中创建一个表以自动捕获失败的作业:
php artisan queue:failed-table
Run Code Online (Sandbox Code Playgroud)
在运行队列的脚本中,您应该添加失败前的尝试次数:
php artisan queue:listen --tries=3
Run Code Online (Sandbox Code Playgroud)
添加某种超时也很聪明:
php artisan queue:listen --tries=3 --timeout=60
Run Code Online (Sandbox Code Playgroud)
您还可以通过向作业添加失败的方法来调用失败时的 webhook:
public function failed()
{
// Called when the job is failing...
}
Run Code Online (Sandbox Code Playgroud)
运行有限尝试的命令您可以运行以下命令
php artisan queue:work --retry=3
Run Code Online (Sandbox Code Playgroud)
它只会尝试运行你的工作三次
并以编程方式您可以使用
public $tries = 3;
Run Code Online (Sandbox Code Playgroud)
在你的工作类别中
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
15932 次 |
| 最近记录: |