栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用spring的重试注解@Retryable

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用spring的重试注解@Retryable

重试的依赖

  
        
            org.springframework.retry
            spring-retry
        
        
            org.springframework.boot
            spring-boot-starter-aop
        

使用@Retryable需要在程序入口类上使用@EnableRetry注解开启重试功能

 @Retryable(value = Exception.class, maxAttemptsexpression = "${Retry.maxRetryTime}", backoff = @Backoff(delay = 2000L, multiplier = 1.5))
    public List httpPost(Integer currentPage, Integer pageSize) throws Exception {

        log.info("请求第{}页,每页最大数据量{}", currentPage, pageSize);
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 创建http POST请求
        HttpPost httpPost = new HttpPost(httpClientConfig.URL);
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.setHeader("Accept", "application/json");

        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(httpClientConfig.getConnectTimeout())
                .setSocketTimeout(httpClientConfig.getSocketTimeout()).build();
        httpPost.setConfig(requestConfig);

        String parameters = "{"currentPage":" + currentPage + ',' + ""pageSize":" + pageSize + "}";
        StringEntity entity = new StringEntity(parameters, "utf-8");
        // 将请求实体设置到httpPost对象中
        httpPost.setEntity(entity);
        CloseableHttpResponse response = null;
        List list = null;

        // 执行请求
        response = httpclient.execute(httpPost);
        // 判断返回状态是否为200
        if (response.getStatusLine().getStatusCode() == 200) {
            String content = EntityUtils.toString(response.getEntity(), "UTF-8");
            JSONObject jsStr = JSONObject.parseObject(content);
            // 获取到返回值,转为json字符串
            String jsonString = jsStr.getJSONObject("data")
                    .getJSONArray("airsettingMappingDtoList").toJSONString();
            list = JSON.parseArray(jsonString, IaqAirsettingMappingDto.class);

        } else {
            log.error("请求代理服务器失败,状态码:{}", response.getStatusLine().getStatusCode());
            throw new HttpClientException("请求代理服务器错误");
        }
        return list;
    }

@Retryable的value指定出现某个异常时进行重试,maxAttempts可以直接指定重试次数(maxAttempts=实际重试次数+1),使用maxAttemptsexpression 也可以指定重试次数,如果使用这个方法,则可以通过从yml文件中获取数据.
backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒

注意点:
@Retryable指定的方法有异常直接抛出,如果try catch则会出现无法重试的情况.
@Retryable标注的方法和它的调用者不能在同一个类中
@Retryable可以使用@Recover来在重试次数用完还没有成功时执行,据其他博客说,需要和@Retryable的方法返回值一样才行…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号