簡體   English   中英

為多個 API 調用配置 spring boot 重試

[英]Configure spring boot retry for multiple API calls

我有一個 spring boot api 應用程序,它有一個 POST 端點,讓我們將它稱為 /doSomething 作為方法。當收到對 /doSomething 端點的請求時,我需要將該數據保存在我們的應用程序中,然后需要為另一個 api[A] 發出 GET 請求該請求必須從 API[B] 獲取,然后再次發布到 API[B]。在這種情況下,處理 spring 重試的最佳方法是什么。

請找到以下代碼

@RequestMapping(value = "/subpub", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
    public String subPub(HttpServletRequest request, HttpServletResponse response, @RequestBody String rawBody) {
    //persists some data on this database

    //this method will invoke api[A] and api[B]
    integrationServiceBean.processCourseMetaData("_id");
    return "OK"
}; 

IntegrationServiceBean 類

package com.org.reader.integration;

@Service
public class IntegrationServiceBean {


    /**
     * This method will process meta data submission for  
     * section details by section id and update meta data
     *
     * @param sectionId
     */
    @Retryable(RuntimeException.class)
    public void processCourseMetaData(final String sectionId) {

        System.out.println("Invoking processCourseMetaData");

        ResponseEntity<String> responseEntity = registrarService.findOneSection(sectionId);
        String responseBody = responseEntity.getBody();

        LinkedHashMap requestObj = (LinkedHashMap) JsonUtils.jsonToObject(responseBody);
        LinkedHashMap metaDataObj = (LinkedHashMap) requestObj.get(Constant.Response.META_DATA);
        if (!contextConfig.getMetaDataCopyable().isEmpty()) {

            metaDataObj.put(Constant.MetaData.COPYABLE, contextConfig.getMetaDataCopyable());
        }
        if (!contextConfig.getMetaDataPending().isEmpty()) {

            metaDataObj.put(Constant.MetaData.PENDING, contextConfig.getMetaDataPending());
        }
        metaDataObj.put(Constant.MetaData.LAUNCH_URL, getLaunchUrlByEnvironment(requestObj, sectionId));

        String updatedSectionPayload = JsonUtils.toJsonString(requestObj);

        registrarService.updateSection(sectionId, updatedSectionPayload);
    }

    @Recover
    public void recover(RuntimeException e){
        System.out.println("Recovering - returning safe value"+e.getMessage());

    }



}

我的問題是,如果對集成服務 bean 應用重試,是否會影響應用程序的主要部分的性能,例如在主要端點上保存數據。

什么是最佳實踐

通過阻塞當前正在執行的線程,在分離的線程中調用標記為@Retryable的方法。

就您的代碼前景而言,

保存發生在線程(比如線程 A)中,集成服務正在其他線程(比如線程 B)中處理。 因此,線程 A 被阻塞,直到 B 完成。 所以下一行integrationServiceBean.processCourseMetaData("_id"); 被阻塞,直到成功或用盡重試限制完成。

來回答你的問題。

保存數據不變。 所以我不認為,有任何性能損失。

談論最佳實踐

每當服務之間存在網絡分區時,使用重試是一種很好的做法。 它使應用程序健壯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM