From ac35f7e2fbcd0ad0565fb05581c50f2c8f51eceb Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Thu, 14 May 2026 23:58:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(update):=20=E4=BF=AE=E5=A4=8D=E5=8D=8E?= =?UTF-8?q?=E4=B8=BA=E4=B8=8A=E4=BC=A0URL=20NPE=E5=8F=8A=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=89=B9=E6=AC=A1=E8=B6=85=E6=97=B6=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - submitToHuawei: urlList 字段做防御性处理,找不到时降级到 data, 同时输出实际响应内容方便排查 - executeSubmitAsync: allOf.join() 改为 get(20, MINUTES), 防止大文件上传卡住时批次线程永久阻塞 Co-Authored-By: Claude Sonnet 4.6 --- .../update/service/StoreSubmissionService.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java b/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java index df83897..ccf4405 100644 --- a/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java +++ b/update-service/src/main/java/com/xuqm/update/service/StoreSubmissionService.java @@ -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 uploadUrlResp = huaweiGetUploadUrl(clientId, token, hwAppId, file); - @SuppressWarnings("unchecked") - Map urlInfo = (Map) ((List) uploadUrlResp.get("urlList")).get(0); + List> 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 urlInfo = urlList.get(0); String uploadUrl = (String) urlInfo.get("url"); @SuppressWarnings("unchecked") Map uploadHeaders = (Map) urlInfo.get("headers");