You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS SDK 2.x从S3读取大文件时遇连接重置超时问题求助

解决S3读取大文件时的连接重置问题

针对你遇到的从S3读取大文件半小时后出现java.net.SocketException: Connection reset的问题,以下是几个有效的解决方向:

1. 配置HTTP客户端的连接存活与超时参数

AWS SDK v2默认的HTTP客户端未设置合适的连接空闲超时,易导致长时间无数据传输时连接被中间网络设备(负载均衡器、防火墙等)断开。需显式配置Apache HttpClient的连接参数:

@Configuration
public class S3Configuration {
    @Bean
    public S3Client s3Client() {
        // 配置Apache HttpClient连接设置
        HttpClientSettings httpClientSettings = HttpClientSettings.builder()
                .connectionTimeout(Duration.ofSeconds(10))
                .socketTimeout(Duration.ofMinutes(5))
                // 设为小于网络设备的空闲超时(如AWS ELB默认60秒,此处设50秒)
                .connectionMaxIdleTime(Duration.ofSeconds(50))
                .tcpKeepAlive(true)
                .build();

        return S3Client.builder()
                .credentialsProvider(DefaultCredentialsProvider.create())
                .region(Region.AP_EAST_1)
                .httpClient(ApacheHttpClient.create(httpClientSettings))
                .overrideConfiguration(ClientOverrideConfiguration.builder()
                        .apiCallAttemptTimeout(Duration.ofHours(6))
                        .retryPolicy(RetryPolicy.builder()
                                .retryCondition(RetryCondition.defaultRetryCondition())
                                .backoffStrategy(BackoffStrategy.defaultExponentialBackoffStrategy())
                                .maxAttempts(5)
                                .build())
                        .build())
                .build();
    }
}

2. 使用分段读取(Range请求)

避免一次性打开整个文件流,按固定大小分段读取,每段使用独立连接,降低单个连接的占用时间:

// 获取文件总大小
HeadObjectResponse headObjectResponse = s3Client.headObject(HeadObjectRequest.builder()
        .bucket(bucketName)
        .key(key)
        .build());
long fileSize = headObjectResponse.contentLength();

// 分段大小设为100MB,可根据实际调整
long chunkSize = 100 * 1024 * 1024;
long start = 0;
long end;

while (start < fileSize) {
    end = Math.min(start + chunkSize - 1, fileSize - 1);
    GetObjectRequest getObjectRequest = GetObjectRequest.builder()
            .bucket(bucketName)
            .key(key)
            .range(String.format("bytes=%d-%d", start, end))
            .build();

    try (ResponseInputStream<GetObjectResponse> inputStream = s3Client.getObject(getObjectRequest)) {
        // 处理当前分段流,注意避免文本跨段截断(可调整分段大小对齐行边界)
        processChunk(inputStream);
    }

    start = end + 1;
}

3. 调整Spring Batch读取配置

针对FlatFileItemReader,调整缓冲区大小和读取批次,减少单批次读取时长:

@Bean
public FlatFileItemReader<YourItem> flatFileItemReader(Resource resource) {
    return new FlatFileItemReaderBuilder<YourItem>()
            .resource(resource)
            .lineMapper(yourLineMapper())
            .bufferSize(8192)
            .maxItemCount(1000)
            .build();
}

4. 排查网络环境

  • 确认防火墙/代理服务器的连接空闲超时设置,调整超时时间或启用Keep-Alive
  • 检查VPC端点(若使用)的配置,确保无连接时长限制

内容的提问来源于stack exchange,提问作者User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:12:02