项目在调用远程接口的时候会因为很多原因导致失败,所以接口调用失败后需要重试,重试策略用的是spring-retry,是spring提供的一个基于spring的重试框架,使用非常简单,在方法上加上注解就行,对代码的侵略小。
更多方法看官网:/spring-projects/spring-retry
首先在springboot项目中引入maven依赖,方法重试是基于aop的,这个也要加上。
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
在启动类上加上注解@EnableRetry(proxyTargetClass = true)
调用需要重试的方法单独写一个类,和被调用的类要分开,不然会导致方法重试不成功,在需要重试的方法上加上注解,@Retryable(value = ApiRuntimeException.class, maxAttempts = 5, backoff = @Backoff(delay = 4000L, multiplier = 2))。
ApiRuntimeException.class 表示抛出的异常类。
maxAttempts 方法最多重试次数。
delay 重试间隔时间。
multiplier 距离上一次重试的时间倍数。
这几个比较常用,更多参数可以参考官网。
@Recover注解是重试结束时调用的方法,返回类型和抛出的异常必须与@Retryable方法匹配。
@Retryable(value = ApiRuntimeException.class, maxAttempts = 5, backoff = @Backoff(delay = 4000L, multiplier = 2))public void syncJobTask(JSONObject object) throws IOException {MediaType mediaType = MediaType.parse("application/json; charset=utf-8");Request request = new Request.Builder().url(syncJobPost).post(RequestBody.create(mediaType, object.toString())).build();Response response = client.newCall(request).execute();JSONObject jsonObject = JSONObject.parseObject(response.body().string());log.info("调用同步作业方法返回值。。。。"+jsonObject);Boolean success = Boolean.valueOf(jsonObject.get("success").toString());PublishJobTaskOperate jobTaskOperate = new PublishJobTaskOperate();jobTaskOperate.setRequestInterface(Consts.SYNC_JOB_POST);jobTaskOperate.setIsSuccess(success);jobTaskOperate.setCode(String.valueOf(jsonObject.get("code")));publishJobTaskOperateDao.save(jobTaskOperate);if(!success){throw new ApiRuntimeException(Consts.ERROR_SSH_PROXY_CONN,"调用同步作业方法失败!");}}@Recoverpublic void doRecover() throws ApiRuntimeException {log.info("全部重试失败,执行doRecover");}
如果觉得《java调用接口失败后重试》对你有帮助,请点赞、收藏,并留下你的观点哦!