fix(update): 修复华为上传URL NPE及提交批次超时限制

- submitToHuawei: urlList 字段做防御性处理,找不到时降级到 data,
  同时输出实际响应内容方便排查
- executeSubmitAsync: allOf.join() 改为 get(20, MINUTES),
  防止大文件上传卡住时批次线程永久阻塞

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-05-14 23:58:10 +08:00
父节点 1a18925034
当前提交 ac35f7e2fb

查看文件

@ -228,7 +228,15 @@ public class StoreSubmissionService {
}))
.toList();
if (!futures.isEmpty()) {
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
try {
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
.get(20, java.util.concurrent.TimeUnit.MINUTES);
} catch (java.util.concurrent.TimeoutException te) {
log.error("Store submit batch timed out after 20 minutes for version={}", versionId);
futures.forEach(f -> f.cancel(true));
} catch (Exception e) {
log.error("Store submit batch wait error for version={}: {}", versionId, e.getMessage());
}
}
recordBatchEvent(v, versionId, batchId, "STORE_SUBMIT_BATCH_END", startedAt, Map.of(
"targets", targets,
@ -285,8 +293,12 @@ public class StoreSubmissionService {
// 3. Request upload URL
Map<String, Object> uploadUrlResp = huaweiGetUploadUrl(clientId, token, hwAppId, file);
@SuppressWarnings("unchecked")
Map<String, Object> urlInfo = (Map<String, Object>) ((List<?>) uploadUrlResp.get("urlList")).get(0);
List<Map<String, Object>> urlList = asMapList(uploadUrlResp.get("urlList"));
if (urlList.isEmpty()) urlList = asMapList(uploadUrlResp.get("data"));
if (urlList.isEmpty()) {
throw new RuntimeException("Huawei: upload url response missing urlList, response=" + summarizeMap(uploadUrlResp));
}
Map<String, Object> urlInfo = urlList.get(0);
String uploadUrl = (String) urlInfo.get("url");
@SuppressWarnings("unchecked")
Map<String, String> uploadHeaders = (Map<String, String>) urlInfo.get("headers");