遇到j.i.IOException: Premature close错误,求排查解决(附Gatling代码)
错误原因排查与解决方法
可能的原因
- 代理协议不匹配:目标地址是HTTP协议,但配置的代理端口为443(通常是HTTPS代理端口),代理服务器可能拒绝转发HTTP请求,导致连接被提前关闭。
- 响应体读取时机错误:在独立的
exec步骤中直接打印响应体,Gatling的异步处理机制可能已经关闭了响应流,触发Premature close。 - 代理未配置认证:如果代理服务器需要身份验证,未提供凭证会导致服务器主动断开连接。
对应的解决方法
1. 修正代理配置
确认代理服务器支持的协议和端口,调整配置:
- 如果代理同时支持HTTP和HTTPS,明确指定对应端口:
Proxy proxy = new Proxy("m1-resolver.hsenidmobile.com", 8080); // HTTP代理端口 proxy.setHttpsPort(443); // HTTPS代理端口 HttpProtocolBuilder httpProtocol = http.baseUrl("http://atominik.com").proxy(proxy);
- 如果目标网站支持HTTPS,将
baseUrl改为https://atominik.com,适配代理的443端口。
2. 调整响应体处理方式
避免在独立exec步骤中读取响应体,改为在check阶段直接处理:
.exec(http("Proxy Request") .get("/") .check(status().is(200)) .check(bodyString().transform(body -> { // 用Gatling日志API打印,而非System.out org.slf4j.LoggerFactory.getLogger(getClass()).info(body); return body; }).saveAs("responseBody")) )
3. 添加代理认证(如果需要)
如果代理要求用户名密码,补充凭证配置:
HttpProtocolBuilder httpProtocol = http.baseUrl("http://atominik.com") .proxy(new Proxy("m1-resolver.hsenidmobile.com", 443) .credentials("your-username", "your-password"));
内容的提问来源于stack exchange,提问作者kayu
相关产品推荐
相关产品推荐

