2016-11-21 105 views
1

我有一個彈出引導api應用程序,它有一個POST端點,允許將它稱爲/ doSomething作爲方法.when接收/ doSomething端點請求 我需要將該數據保存在我們的應用程序上,那麼需要使用該請求對另一個api [A]進行GET請求,必須從API [B]獲取,然後再次發佈到API [B]。在這種情況下,處理彈簧重試的最佳方式是什麼。爲多個API調用配置彈簧引導重試

請找到下面的代碼

@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.pearson.reader.integration; 

@Service 
public class IntegrationServiceBean { 


    /** 
    * This method will process meta data submission for registrar api by invoking authentication service, receive 
    * 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將它爲應用程序前的主要部分的性能影響。主要終點的保存數據。

什麼是最好的做法

+0

請縮小第二段代碼的大小。你應該提供_minimal_例子。 –

回答

1

通過阻塞當前執行的線程的方法是@Retryable被稱爲獨立的線程。

在代碼中潛在的長期,

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

來到你的問題。

保存數據未觸及。所以我不認爲,有任何表現受到打擊。

談到最佳實踐

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

+0

我有一個問題在線程中,我們需要發送回調到調用者的例子成功狀態,如果重試發生在線程B線程A等待線程B完成,因此線程A可能發生超時是否有任何方法使線程B異步它會成爲問題 –

+0

如果您正在使Integration Service調用異步。 A期望B返回一些東西,換言之,A取決於B輸出。由於B正在運行是異步的,所以返回A而不等待B. 它會傷害你的異常。 如果Integration Service沒有返回任何內容。關係就像A只要求集成服務並向前邁進。換句話說,只有服務的調用比期待服務的回報更重要。在這種情況下,你可能會想到異步。 – theBeacon