当前位置: 首页 > news >正文

wordpress评论通知站长人防网站建设

wordpress评论通知站长,人防网站建设,东平县建设局信息网站,创意交易平台网主要用于在模块调用中,出现失败、异常情况下,仍需要进行重复调用。并且在最终调用失败时,可以采用降级措施,返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件,其原理采用aop机制,所以需要额外…

主要用于在模块调用中,出现失败、异常情况下,仍需要进行重复调用。并且在最终调用失败时,可以采用降级措施,返回一般结果。

1、重试机制

我们采用spring 提供的retry 插件,其原理采用aop机制,所以需要额外引入starter-aop包

1、依赖引入

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency>

2、在主启动类或者需要重试的方法所在的类上添加注解@EnableRetry

3、在需要重试的方法上增加注解 @Retryable,表示该方法需要重试。可以定义在接口的抽象方法上,也可以定义在实际的具体方法上。

public interface RetryService {/*** 指定异常CustomRetryException重试,重试最大次数为4(默认是3),重试补偿机制间隔200毫秒* 还可以配置exclude,指定异常不重试,默认为空* @return result* @throws CustomRetryException 指定异常*/@Retryable(value = {CustomRetryException.class},maxAttempts = 4,backoff = @Backoff(200))String retry() throws CustomRetryException;
}

@Retryable注解参数说明:

maxAttempts :最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;

value:抛出指定异常才会重试,支持多异常

include:和value一样,默认为空,当exclude也为空时,默认所以异常

exclude:指定不处理的异常

backoff:重试等待时间策略,默认使用@Backoff的value默认为1000L,我们设置为200L。

@Backoff注解中的参数说明:

value:隔多少毫秒后重试,默认为1000L;

delay:和value一样,但是默认为0;

multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。

④可以同时在同一个类中使用@Recover来处理N次处理后都没有成功后需要处理的事情

可以在指定方法上标记@Recover来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中)

3e6b29cabf1d44328c04240da2b9e781.png

2、请求降级

使用@Recover实现降级措施

当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调。

@Retryable和@Recover修饰的方法要在同一个类中,且被@Retryable 标记的方法不能有返回值,这样Recover方法才会生效。

/*** value:抛出指定异常才会重试* include:和value一样,默认为空,当exclude也为空时,默认所有异常* exclude:指定不处理的异常* maxAttempts:最大重试次数,默认3次* backoff:重试等待策略,* 默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000; 以毫秒为单位的延迟(默认 1000)* multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。* @param code* @return* @throws Exception*/@Override@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))public int testRetry(int code) throws Exception{System.out.println("test被调用,时间:"+ LocalTime.now());if (code==0){throw new Exception("情况不对头!");}System.out.println("test被调用,情况对头了!");return 200;} /*** Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法。* 如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。* 可以看到传参里面写的是 Exception e,这个是作为回调的接头暗号(重试次数用完了,还是失败,我们抛出这个Exception e通知触发这个回调方法)。* 注意事项:* 方法的返回值必须与@Retryable方法一致* 方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)* 该回调方法与重试方法写在同一个实现类里面** 由于是基于AOP实现,所以不支持类里自调用方法* 如果重试失败需要给@Recover注解的方法做后续处理,那这个重试的方法不能有返回值,只能是void* 方法内不能使用try catch,只能往外抛异常* @Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。* @param e* @param code* @return*/@Recoverpublic int recover(Exception e, int code){System.out.println("回调方法执行!!!!");//记日志到数据库 或者调用其余的方法System.out.println("异常信息:"+e.getMessage());return 400;} 

3、 RetryTemplate

对每个方法上进行注解定义以及对应降低方法定义,过于繁琐。

spring 提供 retryTemplate 的bean对象,定义一个可重试、降级的代理对象。

RetryTemplate提供了RetryOperations的一种具体实现。它被认为是从中创建bean的良好做法。

1、定义retryTemplate对象

    @Bean@ConditionalOnMissingBeanpublic RetryTemplate retryTemplate(){final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();simpleRetryPolicy.setMaxAttempts(4);
​final FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();fixedBackOffPolicy.setBackOffPeriod(1000L);
​return RetryTemplate.builder().customPolicy(simpleRetryPolicy).customBackoff(fixedBackOffPolicy).retryOn(CustomRetryException.class).build();}

 2、使用retryTemplate

@Autowiredpivate RetryTemplate retryTemplate;
​@Testvoid retryWithoutAnnotation(){try {String message = retryTemplate.execute(x -> retryService.retryWithoutAnnotation());log.info("message = "+message);} catch (CustomRetryException e) {log.error("Error while executing test {}",e.getMessage());}}

3、RecoveryCallback 降级

execute时,可以选择输入RecoveryCallback回调,确定重试结束后,仍然出现异常的recovery行为。自定义方法如下:

@Slf4j
public class CustomRecoveryCallback implements RecoveryCallback<String> {
​@Overridepublic String recover(RetryContext retryContext) throws Exception {log.info("Default Retry service test,total retry {}",retryContext.getRetryCount());return "Error Class :: " + retryContext.getLastThrowable().getClass().getName();}
}

4、RetryListenerSupport生命周期控制

如果我们想在重试整个生命周期中,按照不同的阶段设置一些事件监听处理机制,那怎么办呢?设置自定义的RetryListenerSupport能帮助到我们。我们继承RetryListenerSupport,并重新Override close 、onError、open方法,这三个方法分别表示

  • 所有重试结束时 close
  • 每一次重试发生异常时 onError
  • 重试正式开始前 open
@Slf4j
public class DefaultListenerSupport extends RetryListenerSupport {
​@Overridepublic <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {log.info("DefaultListenerSupport close");super.close(context, callback, throwable);}
​@Overridepublic <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {log.info("DefaultListenerSupport onError");super.onError(context, callback, throwable);}
​@Overridepublic <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {log.info("DefaultListenerSupport open");return super.open(context, callback);}
}

 并且在构造RetryTemaplate时候,设置withListener字段。

@Bean
@ConditionalOnMissingBean
public RetryListenerSupport retryListenerSupport(){return new DefaultListenerSupport();
}
​
@Bean
@ConditionalOnMissingBean
public RetryTemplate retryTemplate(RetryListenerSupport retryListenerSupport){
​...return RetryTemplate.builder().customPolicy(simpleRetryPolicy).customBackoff(fixedBackOffPolicy).withListener(retryListenerSupport).retryOn(CustomRetryException.class).build();
}

 

 

http://www.yayakq.cn/news/309776/

相关文章:

  • 聊城有制作网站的吗上海到北京火车时刻表查询
  • 西夏区建设交通网站wordpress需要懂什么
  • 深圳网站建设q479185700強怎么设计页面只显示一页
  • odoo做网站大连专业网站设计服务商
  • 徐州网站建设 网站推广100平米餐馆装修设计
  • 影音先锋资源网站建设wordpress 页面压缩
  • 爱站网 关键词挖掘工具站长工具汕头网站设计开发
  • 公司门户网站建设特点代做毕设要注册答疑网站
  • 网站原创内容跨平台软件开发工具
  • 滑县住房城乡建设厅门户网站wordpress整合教程
  • 太原做企业网站的低代码小程序开发平台
  • 做推广网站排名建筑工程培训
  • 道滘镇做网站公司网站设计制作
  • 网站建设中广告法绝对化用语整理用php做注册网站的代码
  • 游戏网站后台建设住房和城乡建设部网站园林一级
  • 有赞商城网站建设域名服务器分为
  • 北京市中交建设有限公司网站深圳装修公司前十强
  • 济南哪个网络公司建网站好抖音代运营电话话术
  • 网上学习做网站中小企业网站建设 网络营销
  • 1688网站店招怎么做网站建设模板购买
  • 快站怎么做淘客网站新手建设网站步骤
  • 大型门户网站建设哪家好宝安福永小学网站建设
  • 成都网站建设团队旅游网站建设的方向
  • 嘉兴网站制作策划昆山网站网站建设
  • 网站怎么做cp备案号自建商城网站有哪些平台
  • 做网站用的各种图标大全免费咨询刑事辩护在线律师
  • 建设银行注册网站名咋设置建设银行网站怎么交学费
  • 相亲网站怎么做互联网推广手段
  • 外贸展示型模板网站模板wordpress首页显示vip标识
  • 东阿做网站多少钱成都个人网站制作