发现stream里边一个好用的retry组件

说明:

代码设计的挺好的,以后可以参考,在此记录下
翻译说明

使用重试语义简化操作执行的模板类。

Retryable操作封装在RetryCallback接口的实现中,并使用提供的execute方法之一执行。

默认情况下,如果抛出任何异常或异常的子类,则重试操作。可以使用setRetryPolicy(RetryPolicy)方法更改此行为。

另外,在默认情况下,每个操作最多重试三次,其间没有后退。可以使用setRetryPolicy(RetryPolicy)和setBackOffPolicy(BackOffPolicy)属性配置此行为。BackOffPolicy控制每次重试之间的暂停时间。

这个类是线程安全的,适合在执行操作和执行配置更改时并发访问。因此,可以动态更改重试次数以及使用的BackOffPolicy,并且不会影响正在进行的可重试操作。

maven引入


​​​​<!--       retry组件,stream里边使用了,这里是一个例子-->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.3.0</version>
</dependency>

例子表述

 public static void main(String[] args) {
        // 字面意思,统计信息的监听
        DefaultStatisticsRepository defaultStatisticsRepository = new DefaultStatisticsRepository();
        StatisticsListener statisticsListener = new StatisticsListener(defaultStatisticsRepository);

        RetryTemplate retryTemplate = RetryTemplate.builder()
                // 重试10次
                .maxAttempts(10)
                .withListener(statisticsListener)
                // 阻断时间1秒
                .fixedBackoff(1000)
                .build();
        String execute = retryTemplate.execute(context -> {
            System.out.println(context.getRetryCount());
            return "hello world";
        });
        System.out.println(execute);
    }

结构分析

对于许多代码,大概都包含配置config,作为全局配置,用于组件启动过程的初始化配置信息和组件内部的局部配置信息,上下文context可作为线程上下文或全局上下文,会贯穿整个组件生命周期前后,产生到销毁的过程中,会在生命周期内的各个内部组件的执行过程中所应用,像spring也会实现该上下文接口转化出一个子类上下文,用于扩展组件,便于数据的隔离。具体执行处理器processer,执行器一般会作为一个连接桥的功能,比如由一个采集数据的执行器processer执行完之后,将进入格式化的执行器processer,格式化Parser的执行器processer执行完之后,将进入发送Sink的执行器processer。设计模式好像都有单例模式、工厂模式、责任链、建造者、观察者模式等等,如果包含Manager管理者的话,一般包含静态成员变量或ThreadLocal容器,有的组件还包含了统计的stat类,进行调用次数或执行状态的统计,统计类一般被具体执行类继承或者封装到上下文content里边,如果需要对数据进行进一步增强处理,有的组件会加入拦截器链的形式对数据进行格式化处理。并且多余实现多态的一个通性,大多都是execute进入方法,doExecute将执行方法,其他的例如process、doProcess,create、doCreate,handler、doHandler,service、doService,start、doStart,filter、doFilter等等,当然如果系统更加丰富的化,应该加入元数据信息接口,被执行类所继承,设置执行类的元数据信息,如果像tomcat、spring等代码,则需要生命周期lifecicle的管理,对于support结尾的类一般作为扩展接口出现。

代码模式:类似于jdk8的流式编程更好的可读性。这里是这样的,当然也可以直接进行实例化操作。

RetryTemplate retryTemplate = RetryTemplate.builder()
        .maxAttempts(10)
        .fixedBackoff(1000)
        .build();

1: 处理器Processer

这里边叫做RetryOperations,执行操作叫做execute。实现类即RetryTemplate

2: BackOff重试阻塞类图构建

3:重试机制类图构建:

4:监听类图,监听作为列表数据存在retrytemplate中,执行execute后,RetryCallback前遍历执行,注释表述是起到对context的增强作用

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章