package com.nanri.aiimage.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 统一 HTTP 客户端配置命名空间(task-167)。 * * `aiimage.http-client.*`:connect/read/call 超时与重试默认值与现状一致 * (RustFS 客户端契约表基线);非法值钳制到合理范围;env 覆盖走宽松绑定。 */ @Data @Component @ConfigurationProperties(prefix = "aiimage.http-client") public class HttpClientProperties { /** 连接超时(毫秒),默认 10000 与现状一致。 */ private long connectTimeoutMillis = 10_000; /** 读取超时(毫秒),默认 60000 与现状一致。 */ private long readTimeoutMillis = 60_000; /** 调用总超时(毫秒),默认 90000 与现状一致。 */ private long callTimeoutMillis = 90_000; /** 最大重试次数(0-10),默认 3 与现状一致。 */ private int maxRetries = 3; /** 重试基础延迟(毫秒),默认 500 与现状一致。 */ private long baseRetryDelayMillis = 500; /** 钳制后的连接超时:1s-300s。 */ public long effectiveConnectTimeoutMillis() { return clamp(connectTimeoutMillis, 1_000, 300_000); } /** 钳制后的读取超时:1s-3600s。 */ public long effectiveReadTimeoutMillis() { return clamp(readTimeoutMillis, 1_000, 3_600_000); } /** 钳制后的调用总超时:1s-7200s。 */ public long effectiveCallTimeoutMillis() { return clamp(callTimeoutMillis, 1_000, 7_200_000); } /** 钳制后的重试次数:0-10。 */ public int effectiveMaxRetries() { return (int) clamp(maxRetries, 0, 10); } private static long clamp(long value, long min, long max) { if (value < min) { return min; } return Math.min(value, max); } }