發現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的增強作用

 

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