package com.nanri.aiimage.config; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; /** * 图片下载客户端统一配置解析(task-171)。 * * 真实基线(已核实,对应 task-166 契约表"图片下载"行):SimilarAsinImageEmbedder 使用自建 * OkHttpClient(不参与共享 JDK HttpClientPool),connect/read/write 均取 * aiimage.similar-asin.image-download-timeout-seconds(默认 5s),call = 2×download; * 整批预取预算 image-prefetch-timeout-seconds(默认 1800s);无显式次数重试 * (OkHttp retryOnConnectionFailure + 上游批次重提)。 * * 语义:模块级现有配置优先(保证接入切点时行为不变),命名空间 aiimage.http-client.* 兜底。 * 次数重试/退避来自命名空间,为未来接入切点预留;当前不改变 SimilarAsinImageEmbedder 调用点。 */ @Component @RequiredArgsConstructor public class ImageDownloadHttpConfigResolver { private final HttpClientProperties httpClientProperties; private final SimilarAsinProperties similarAsinProperties; private int downloadSeconds() { return similarAsinProperties.getImageDownloadTimeoutSeconds(); } /** 连接超时:模块 download 秒数优先(现状 5s);未配置回退命名空间。 */ public long connectTimeoutMillis() { int module = downloadSeconds(); return module > 0 ? module * 1_000L : httpClientProperties.effectiveConnectTimeoutMillis(); } /** 读取超时:模块 download 秒数优先(现状 5s);未配置回退命名空间。 */ public long readTimeoutMillis() { int module = downloadSeconds(); return module > 0 ? module * 1_000L : httpClientProperties.effectiveReadTimeoutMillis(); } /** 调用总超时:模块 download×2(现状 10s);未配置回退命名空间。 */ public long callTimeoutMillis() { int module = downloadSeconds(); return module > 0 ? module * 2_000L : httpClientProperties.effectiveCallTimeoutMillis(); } /** 整批图片预取预算(秒转毫秒):模块优先(现状 1800s);未配置回退命名空间 read。 */ public long prefetchTimeoutMillis() { int module = similarAsinProperties.getImagePrefetchTimeoutSeconds(); return module > 0 ? module * 1_000L : httpClientProperties.effectiveReadTimeoutMillis(); } /** 次数重试:来自命名空间(现状图片下载无次数重试,OkHttp 仅连接失败自愈)。 */ public int maxRetries() { return httpClientProperties.effectiveMaxRetries(); } public long baseRetryDelayMillis() { return httpClientProperties.getBaseRetryDelayMillis(); } }