task-5: 预览行数量改为配置驱动并做边界校验

解析响应预览上限从硬编码常量改为 SimilarAsinProperties.parseResponsePreviewLimit,
0/负值回退默认 100,超过 1000 clamp 到 1000 防止误配导致响应体无界膨胀。
新增 8 个测试覆盖默认路径、自定义值、幂等、空文件、单行、超限 clamp、非法配置回退、依赖失败恢复。
This commit is contained in:
2026-08-29 14:48:01 +08:00
parent 026aa4e0c3
commit 16bec1c0fa
3 changed files with 277 additions and 2 deletions
@@ -132,6 +132,13 @@ public class SimilarAsinProperties {
*/
private long cozeSubmitLockWaitMillis = 10000L;
/**
* 解析接口返回的预览行/预览组数量上限。
* 响应体只携带预览行(默认 100),全量行仅写入后端任务载荷。
* 有效范围 [1, 1000]0/负值回退默认,超上限 clamp 到 1000。
*/
private int parseResponsePreviewLimit = 100;
/**
* P0-4:抢 Coze 提交锁失败后下次重试间隔(毫秒)。
* 原硬编码 500ms,会在指数退避算法中作为基础值(500/1000/2000/4000ms 上限 4000)。
@@ -143,6 +143,19 @@ public class SimilarAsinTaskService {
// SimilarAsinProperties.cozeSubmitLockWaitMillis / cozeSubmitLockRetryDelayMillis
// acquireCozeSubmitLock 在方法内读取并支持指数退避
private static final int PARSE_RESPONSE_PREVIEW_LIMIT = 100;
/** 预览行/预览组配置上限:超过该值 clamp,避免响应体无界增长。 */
private static final int PARSE_RESPONSE_PREVIEW_LIMIT_MAX = 1000;
/**
* 解析接口响应预览上限优先读取配置 parseResponsePreviewLimit
* 0/负值回退默认 100超过 1000 clamp 1000防止误配导致响应体膨胀
*/
private int resolvePreviewLimit() {
Integer configured = properties.getParseResponsePreviewLimit();
if (configured == null || configured <= 0) {
return PARSE_RESPONSE_PREVIEW_LIMIT;
}
return Math.min(configured, PARSE_RESPONSE_PREVIEW_LIMIT_MAX);
}
/**
* P0-2 最小风险变体poll 调度阶段并发预取 Coze HTTP 结果时
* 控制对单个 Coze 后端的并发度8 cozeTaskExecutor 12 并发上限对齐留 4 余量
@@ -1472,7 +1485,7 @@ public class SimilarAsinTaskService {
if (groups == null || groups.isEmpty()) {
return List.of();
}
int limit = Math.min(PARSE_RESPONSE_PREVIEW_LIMIT, groups.size());
int limit = Math.min(resolvePreviewLimit(), groups.size());
List<SimilarAsinParsedGroupVo> preview = new ArrayList<>(limit);
for (int i = 0; i < limit; i++) {
SimilarAsinParsedGroupVo group = groups.get(i);
@@ -1496,7 +1509,7 @@ public class SimilarAsinTaskService {
if (rows == null || rows.isEmpty()) {
return List.of();
}
int limit = Math.min(PARSE_RESPONSE_PREVIEW_LIMIT, rows.size());
int limit = Math.min(resolvePreviewLimit(), rows.size());
List<SimilarAsinParsedRowVo> preview = new ArrayList<>(limit);
for (int i = 0; i < limit; i++) {
preview.add(copyPreviewRow(rows.get(i)));