「原创声明:保留所有权利,禁止转载」
本人在使用 httpclient 做接口测试的过程中,之前并没有考虑到请求失败自动重试的情况,但有时又需要在发生某些错误的时候重试,比如超时,比如响应频繁被拒绝等等,在看过官方的示例后,自己写了一个自动重试的控制器。分享代码,供大家参考。
下面是获取控制器的方法:
/**
* 获取重试控制器
*
* @return
*/
private static HttpRequestRetryHandler getHttpRequestRetryHandler() {
return new HttpRequestRetryHandler() {
public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
logger.warn("请求发生错误!", exception);
if (executionCount > HttpClientConstant.TRY_TIMES) return false;
if (exception instanceof NoHttpResponseException) {
logger.warn("没有响应异常");
sleep(1);
return true;
} else if (exception instanceof ConnectTimeoutException) {
logger.warn("连接超时,重试");
sleep(5);
return true;
} else if (exception instanceof SSLHandshakeException) {
logger.warn("本地证书异常");
return false;
} else if (exception instanceof InterruptedIOException) {
logger.warn("IO中断异常");
sleep(1);
return true;
} else if (exception instanceof UnknownHostException) {
logger.warn("找不到服务器异常");
return false;
} else if (exception instanceof SSLException) {
logger.warn("SSL异常");
return false;
} else if (exception instanceof HttpHostConnectException) {
logger.warn("主机连接异常");
return false;
} else if (exception instanceof SocketException) {
logger.warn("socket异常");
return false;
} else {
logger.warn("未记录的请求异常:{}", exception.getClass());
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
// 如果请求是幂等的,则重试
if (!(request instanceof HttpEntityEnclosingRequest)) {
sleep(2);
return true;
}
return false;
}
};
}
这样超时时间和重试次数来作为判断接口请求失败的依据了。下面是控制器设置方法:
/**
* 通过连接池获取https协议请求对象
* <p>
* 增加默认的请求控制器,和请求配置,连接控制器,取消了cookiestore,单独解析响应set-cookie和发送请求的header,适配多用户同时在线的情况
* </p>
*
* @return
*/
private static CloseableHttpClient getCloseableHttpsClients() {
// 创建自定义的httpsclient对象
CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setRetryHandler(httpRequestRetryHandler).setDefaultRequestConfig(requestConfig).build();
// CloseableHttpClient client = HttpClients.createDefault();//非连接池创建
return client;
}
技术类文章精选
- java 一行代码打印心形
- Linux 性能监控软件 netdata 中文汉化版
- 接口测试代码覆盖率(jacoco)方案分享
- 性能测试框架
- 如何在 Linux 命令行界面愉快进行性能测试
- 图解 HTTP 脑图
- 如何测试概率型业务接口
- httpclient 处理多用户同时在线
- 将 swagger 文档自动变成测试代码
- 五行代码构建静态博客
- httpclient 如何处理 302 重定向
- 基于 java 的直线型接口测试框架初探
- Tcloud 云测平台 -- 集大成者
非技术文章精选
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「原创声明:保留所有权利,禁止转载」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。