<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 使用 Spring Boot 的 SpringRetry 模塊示例 > 原文: [https://howtodoinjava.com/spring-boot2/spring-retry-module/](https://howtodoinjava.com/spring-boot2/spring-retry-module/) 在此[ Spring Boot 教程](https://howtodoinjava.com/spring-boot-tutorials/)中,學習如何使用 **spring retry 模塊**工具來構建應用程序,在該工具中,我們必須調用某些有時會期望出現異常的方法,并且必須重試該請求。 在這種情況下,如果必須在任何后端服務調用上實現任何重試功能,則通常我們使用循環和中斷條件來實現,并繼續重試至某些重試限制。 但是這種解決方案容易出錯。 Spring 為我們提供了一個圍繞這個叫做`spring-retry`的簡單框架,可以使用注解進行配置。 我們可以定義重試限制,后備方法等。 ## 1\. 為什么我們需要重試? 在我們的大多數項目中,通常會遇到一些場景,如果它是第一次下降,則可以重試很少的操作。 例如,假設在調用任何后端外部服務的過程中,該服務可能由于諸如網絡中斷,服務器關閉,網絡故障,死鎖等原因而關閉。在這種情況下,通常在發送特定錯誤到客戶端程序之前,我們嘗試重試該操作幾次,以使處理更健壯,更不容易出錯。 有時,它有助于自動重試失敗的操作,以防后續嘗試成功執行。 我想你們所有人都已經遇到了這個問題,并且作為一種解決方法,您很可能會通過循環并在達到重試限制后中斷該循環來解決此問題,但是現在借助`spring-retry`模塊,我們不必編寫這樣的代碼來處理重試方案。 ## 2\. `spring-retry` spring 系列的`spring-retry`是另一個實用程序模塊,可以幫助我們以標準方式處理任何特定操作的重試。 在`spring-retry`中,所有配置都是基于簡單注解的。 #### 2.1. SpringRetry 注解 * `@EnableRetry` – 在 Spring Boot 項目中啟用 SpringRetry * `@Retryable` – 表示可以重試的任何方法 * `@Recover` – 指定后備方法! ## 3\. SpringRetry 示例 #### 3.1. 開發環境 我們將使用以下技術棧在下面的示例應用中嘗試`spring-retry`。 * Java,Eclipse,Maven 作為開發環境 * Spring Boot 作為應用程序框架 * `spring-retry`模塊作為重試模塊 * AspectJ 作為`spring-retry`的依賴 #### 3.2. 演示概述 1. 創建一個 Spring 運行項目以公開一次示例 Rest API,它將調用一個容易失敗的后端操作,我們將模擬這種失敗情況以啟動重試。 2. 一個服務類實際上將調用遠程 api,并在失敗時發送異常,我們將基于此自定義異常設計重試,就像一旦收到此異常,我們將重試 3 次并最終返回客戶端。 在這 3 次嘗試中,如果我們從后端服務獲得成功響應,則將返回該成功響應,否則將調用標準后備方法。 #### 3.3. 創建 SpringBoot 項目 第一步,我們將從 spring 初始化器站點創建一個 spring boot 項目,在此我們將測試 SpringRetry 功能。 為此,我們需要轉到 https://start.spring.io/ 并選擇依賴項`web`和`retry`。 下載包含框架項目的 zip 文件,然后導入到 maven。 ![](https://img.kancloud.cn/a3/f7/a3f7c70ceaaa95e5f7f1e35a4b87f51c_1341x631.jpg) Spring Boot 初始化器 #### 3.4. Maven 依賴 Spring 初始化器會在項目中自動添加`spring-boot-starter-data-rest`和`spring-boot-starter-security`依賴項。 為了使測試更加有效,我們將不需要這些,因此我們將從`pom.xml`中刪除這兩個依賴項。 此外,`spring-retry`取決于框架項目中未包含的 **Aspectj**,因此我們將在`pom.xml`文件中添加以下依賴項。 `pom.xml` ```java <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>${version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${version}</version> </dependency> ``` #### 3.5. 創建 Rest API 端點 創建一個示例 Rest 控制器,該控制器將調用后端服務類,在該類中我們將模擬異常,并且`spring-retry`模塊將自動重試。 `MyRestController.java` ```java package com.example.springretry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class MyRestController { @Autowired BackendAdapter backendAdapter; @GetMapping("/retry") @ExceptionHandler({ Exception.class }) public String validateSPringRetryCapability(@RequestParam(required = false) boolean simulateretry, @RequestParam(required = false) boolean simulateretryfallback) { System.out.println("==============================="); System.out.println("Inside RestController mathod.."); return backendAdapter.getBackendResponse(simulateretry, simulateretryfallback); } } ``` 在 Rest Api 中,我們將添加兩個可選的請求參數。 * `Simulationretry` - 模擬異常情況的參數,以便 spring 可以重試。 * `Simulationretryfallback` – 由于我們正在模擬異常,因此在重試某些時間后,我們可以期待成功的后端調用或所有重試失敗。 在這種情況下,我們將使用后退方法來獲取硬編碼/錯誤響應。 現在,此參數將確保所有重試都將失敗,并且我們將僅回退路徑。 #### 3.6. `@EnableRetry`注解 為了啟用`spring-retry`,我們需要在 Spring Boot 應用類中放置一個注解。 因此,打開`SpringRetryApplication`類并在類級別添加`@EnableRetry`。 `SpringRetryApplication.java` ```java package com.example.springretry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.retry.annotation.EnableRetry; @EnableRetry @SpringBootApplication public class SpringRetryApplication { public static void main(String[] args) { SpringApplication.run(SpringRetryApplication.class, args); } } ``` #### 3.7. 后端服務適配器接口和實現 現在,我們將創建一個用于調用外部服務的接口/實現。 在這里,我們實際上不會調用任何外部服務調用,而是通過添加一些隨機邏輯來模擬成功/失敗方案,如下所示。 `BackendAdapter.java` ```java package com.example.springretry; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Recover; import org.springframework.retry.annotation.Retryable; public interface BackendAdapter { @Retryable(value = { RemoteServiceNotAvailableException.class }, maxAttempts = 3, backoff = @Backoff(delay = 1000)) public String getBackendResponse(boolean simulateretry, boolean simulateretryfallback); @Recover public String getBackendResponseFallback(RuntimeException e); } ``` `BackendAdapterImpl.java` ```java package com.example.springretry; import java.util.Random; import org.springframework.stereotype.Service; @Service public class BackendAdapterImpl implements BackendAdapter { @Override public String getBackendResponse(boolean simulateretry, boolean simulateretryfallback) { if (simulateretry) { System.out.println("Simulateretry is true, so try to simulate exception scenario."); if (simulateretryfallback) { throw new RemoteServiceNotAvailableException( "Don't worry!! Just Simulated for Spring-retry..Must fallback as all retry will get exception!!!"); } int random = new Random().nextInt(4); System.out.println("Random Number : " + random); if (random % 2 == 0) { throw new RemoteServiceNotAvailableException("Don't worry!! Just Simulated for Spring-retry.."); } } return "Hello from Remote Backend!!!"; } @Override public String getBackendResponseFallback(RuntimeException e) { System.out.println("All retries completed, so Fallback method called!!!"); return "All retries completed, so Fallback method called!!!"; } } ``` * `@Retryable` – 這是`@EnableRetry`之后的主要注解。 此注解表明,如果我們從方法中獲取`RemoteServiceNotAvailableException`,則在發送響應之前最多重試 3 次。 另外,每次重試都會引入 1 秒的延遲。 * `@Recover` – 后備方法中的內容表示,如果 3 次重試后我們未獲得任何成功響應,則響應將來自此后備方法。 確保將預期的異常作為參數傳遞,否則 spring 將很難找到確切的方法。 * 在調用遠程服務的實際方法中,我們添加了一些自定義邏輯以基于`simulateretry`和`simulateretryfallback`參數控制異常。 代碼很簡單,只要滿足條件就返回期望的異常重試,否則我們將返回成功響應。 此外,我們還基于“隨機數”添加了一些隨機邏輯來模擬故障的隨機性。 * 后備方法實現發送簡單的后備響應。 ## 4\. 測試應用程序 測試部分非常簡單。 我們將在 REST 請求中傳遞適當的參數以模擬重試請求。 #### 4.1. 重試 - 成功或者失敗 讓我們從瀏覽器中的`'http://localhost:8080/retry?simulateretry=true&simulateretryfallback=false'`開始。 基于該參數,我們期望后端服務調用中出現異常,并且與`simulateretryfallback=false`同時出現,我們取決于隨機邏輯(隨機數`%2 == 0` –&gt; 偶隨機數),我們可以期望重試時的成功響應。 因此,一旦我們在瀏覽器中命中了請求,我們可能會在后端獲得異常,并且 spring 將多次重試相同的方法。 結果可能是來自后端的成功響應。 這是我嘗試重試的我的請求之一中的幾行日志。 `Console` ```java =============================== Inside RestController method.. Simulateretry is true, so try to simulate exception scenario. Random Number : 1 =============================== Inside RestController mathod.. Simulateretry is true, so try to simulate exception scenario. Random Number : 2 Simulateretry is true, so try to simulate exception scenario. Random Number : 2 Simulateretry is true, so try to simulate exception scenario. Random Number : 0 All retries completed, so Fallback method called!!! ``` 第一次我找到了成功,第二次我進入了后備道路。 #### 4.2. 重試 - 僅回退 現在嘗試使用`'http://localhost:8080/retry?simulateretry=true&simulateretryfallback=true'`,每次我們拋出`RuntimeException`時,您都會在重試限制之后得到回退響應,從代碼中獲取。 這是我的最后幾行代碼,它在發送響應之前嘗試了 3 次。 `Console` ```java =============================== Inside RestController method.. Simulateretry is true, so try to simulate exception scenario. Simulateretry is true, so try to simulate exception scenario. Simulateretry is true, so try to simulate exception scenario. All retries completed, so Fallback method called!!! ``` ## 5\. SpringRetry 總結 因此,我們已經知道可以使用 **spring retry 模塊**輕松實現基于`Exception`的重試。 因此,下次如果您需要這種要求,則可以使用這種方法。 如果您對此有任何疑問,請在下面評論。 [下載源碼](https://howtodoinjava.com/wp-content/uploads/2018/10/spring-retry.zip) 學習愉快! 參考文獻: [SpringRetry github 存儲庫和文檔](https://github.com/spring-projects/spring-retry)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看