PHP Quickbooks SDK批量请求失败处理及Laravel队列集成咨询
问题解答
1 如何获取批量请求中执行失败的项
你当前的代码没有处理批量请求的返回结果,所以无法拿到失败项。QuickBooks PHP SDK的批量执行方法Execute()会返回包含所有子项执行状态的响应对象,你可以通过遍历响应结果筛选出失败的项,再推送到Laravel队列做延迟重试,参考代码调整如下:
class QuickBooksAPIController extends Controller { public function batchDelete(Request $request, $category) { $chunks = array_chunk($request->data, 30); $allFailedIds = []; foreach ($chunks as $key => $value) { $batch[$key] = $this->dataService()->CreateNewBatch(); foreach ($value as $id) { $item = $this->dataService()->FindById($category, $id); $batch[$key]->AddEntity($item, $id, "delete"); } // 接收批量执行响应 $batchResponse = $batch[$key]->Execute(); foreach ($batchResponse->getBatchItemResponses() as $responseItem) { // getbId() 对应你调用AddEntity时传入的第二个参数,也就是资源ID $itemId = $responseItem->getbId(); // 判断当前项是否执行出错 if ($responseItem->getFault()) { $allFailedIds[] = $itemId; } } } // 存在失败项时推送到队列,延迟1分钟重试 if (!empty($allFailedIds)) { // 你需要提前创建对应的队列任务类处理重试逻辑 \App\Jobs\RetryQuickBooksDelete::dispatch($category, $allFailedIds) ->delay(now()->addMinutes(1)); } return response()->json(['message' => '批量删除操作已处理', 'failed_count' => count($allFailedIds)], 200); } }
你还可以给队列任务设置$tries属性限制最大重试次数,避免因永久无效的请求导致队列无限重试。
2 删除前先查询再加入批量的实现是否合理
这个实现是符合QuickBooks API要求的,不存在逻辑错误:QuickBooks的删除操作要求传入完整的资源实体,特别是SyncToken字段做版本校验,所以必须先查询到最新的实体对象才能发起删除。
不过你当前的实现还有优化空间:现在每个资源ID都单独发起一次查询请求,30个条目就要发30次查询请求,抵消了批量操作的优势。你可以把同批次的30个查询也做成批量查询操作,只需要1次请求就能拿到所有需要删除的实体,进一步降低请求次数。
额外说明
你之前超过30个项返回报错没有具体失败信息,是因为触发了QuickBooks Batch API的单批次数量上限,属于全局请求级别的错误,不会返回单条目的处理状态。你现在已经按30条拆分批次的调整是正确的,拆分后如果是单个条目触发业务规则错误,就能从批量响应中拿到对应的失败条目信息。
内容的提问来源于stack exchange,提问作者Riza Khan
相关产品推荐
相关产品推荐

