Java HttpClient 4.3.5发送文件速度缓慢,附配置代码求解决办法
解决HttpClient 4.3.5文件上传速度缓慢的问题
我之前也碰到过HttpClient 4.3.5大文件上传卡顿的情况,结合你给出的配置片段,咱们来梳理几个关键的优化点,应该能显著提升传输速度:
1. 补全ConnectionConfig的缓冲区配置
你已经计算了buffersize,但看起来没把它应用到ConnectionConfig里。HttpClient的连接缓冲区大小直接影响数据读写的效率,建议明确设置:
// 补全你的ConnectionConfig配置 ConnectionConfig connConfig = ConnectionConfig.custom() .setBufferSize(buffersize > 0 ? buffersize : 1024 * 64) // 推荐64k-128k,默认是8k .build(); // 把SocketConfig和ConnectionConfig都绑定到HttpClientBuilder CloseableHttpClient httpClient = HttpClientBuilder.create() .setDefaultSocketConfig(soConfig) .setDefaultConnectionConfig(connConfig) .build();
2. 优化文件上传的Entity设置
文件上传的Entity配置是影响速度的核心点,别用默认的小缓冲区:
- 如果用
FileEntity,建议用BufferedHttpEntity包装,增大读写缓冲区:
File uploadFile = new File("/path/to/your/file"); HttpEntity fileEntity = new FileEntity(uploadFile, ContentType.APPLICATION_OCTET_STREAM); // 用128k的缓冲区包装,减少磁盘IO次数 HttpEntity bufferedEntity = new BufferedHttpEntity(fileEntity, 1024 * 128);
- 大文件建议开启分块编码(Chunked),但要确保服务器支持:
((AbstractHttpEntity) bufferedEntity).setChunked(true);
3. 调整连接池参数
默认连接池的最大连接数很小,并发上传时会出现等待获取连接的情况,建议根据业务场景调整:
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); connManager.setMaxTotal(20); // 全局最大连接数,根据服务器承载能力调整 connManager.setDefaultMaxPerRoute(10); // 单个域名的最大连接数 CloseableHttpClient httpClient = HttpClientBuilder.create() .setConnectionManager(connManager) .setDefaultSocketConfig(soConfig) .setDefaultConnectionConfig(connConfig) .build();
4. 完善TCP和请求超时配置
不合理的超时设置会导致不必要的等待,建议明确配置:
// 完善SocketConfig SocketConfig soConfig = SocketConfig.custom() .setTcpNoDelay(true) // 你已经开启了,这能减少TCP延迟 .setSoTimeout(30000) // 30秒读取超时,避免长时间挂起 .setSoKeepAlive(true) // 开启TCP保活,维持长连接 .build(); // 添加请求级别的超时配置 RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(10000) // 10秒连接超时 .setConnectionRequestTimeout(10000) // 从连接池拿连接的超时 .build(); // 绑定到HttpClient CloseableHttpClient httpClient = HttpClientBuilder.create() .setDefaultSocketConfig(soConfig) .setDefaultConnectionConfig(connConfig) .setDefaultRequestConfig(requestConfig) .build();
5. 禁用不必要的拦截器
HttpClient默认自带重试、重定向等拦截器,如果你的业务不需要这些功能,可以禁用减少开销:
CloseableHttpClient httpClient = HttpClientBuilder.create() .disableAutomaticRetries() // 禁用自动重试 .disableRedirectHandling() // 禁用重定向(如果不需要) ... // 其他配置 .build();
这些调整后,你可以再测试下文件上传的速度,尤其是大文件场景下应该会有明显改善。
内容的提问来源于stack exchange,提问作者xiaoxu
相关产品推荐
相关产品推荐

