Java 为多个API调用配置spring引导重试

Java 为多个API调用配置spring引导重试,java,spring,performance,spring-boot,spring-retry,Java,Spring,Performance,Spring Boot,Spring Retry,我有一个SpringBootAPI应用程序,它有一个POST端点,让我们调用它/doSomething作为方法 我需要将该数据保存在我们的应用程序上,然后需要对另一个api[A]发出GET请求。该请求必须从api[B]获取,然后再次发布到api[B]。在这种情况下,处理spring重试的最佳方法是什么 请查找下面的代码 @RequestMapping(value = "/subpub", method = RequestMethod.POST, headers = {"content-type=

我有一个SpringBootAPI应用程序,它有一个POST端点,让我们调用它/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());

    }



}
package com.org.reader.integration;
@服务
公共类IntegrationServiceBean{
/**
*此方法将处理提交的元数据
*按节id列出节详细信息并更新元数据
*
*@param sectionId
*/
@可重试(RuntimeException.class)
public void processCourseMetaData(最终字符串节ID){
System.out.println(“调用processCourseMetaData”);
ResponseEntity ResponseEntity=注册服务findOneSection(sectionId);
字符串responseBody=responseEntity.getBody();
LinkedHashMap requestObj=(LinkedHashMap)JsonUtils.jsonToObject(responseBody);
LinkedHashMap metaDataObj=(LinkedHashMap)requestObj.get(Constant.Response.META_DATA);
如果(!contextConfig.getMetaDataCopyable().isEmpty()){
metaDataObj.put(Constant.MetaData.COPYABLE,contextConfig.getMetaDataCopyable());
}
如果(!contextConfig.getMetaDataPending().isEmpty()){
metaDataObj.put(Constant.MetaData.PENDING,contextConfig.getMetaDataPending());
}
metaDataObj.put(Constant.MetaData.LAUNCH_URL,getLaunchUrlByEnvironment(requestObj,sectionId));
String updatedSectionPayload=JsonUtils.toJsonString(requestObj);
RegistrService.updateSection(sectionId,updatedSectionPayload);
}
@恢复
公共无效恢复(运行时异常e){
System.out.println(“恢复-返回安全值”+e.getMessage());
}
}
我的问题是,如果对集成服务bean应用了重试,那么它会对应用程序的主要部分(例如在主端点保存数据)产生性能影响


最佳实践是什么

通过阻塞当前执行的线程,在分离的线程中调用标记为
@Retryable
的方法

就你的代码而言

保存发生在线程(比如线程A)中,集成服务正在其他线程(比如线程B)中处理。因此,线程A被阻塞,直到B结束。所以下一行的
integrationServiceBean.processCourseMetaData(“_id”)被阻止,直到成功完成或重试限制用尽

来回答你的问题。

保存数据不受影响。所以我不认为有任何表现上的打击

谈论最佳实践

每当服务之间存在网络分区时,使用重试是一种良好的做法。
它使应用程序更加健壮。

请减少第二段代码的大小。您应该提供最少的示例。我在线程a中有一个问题,我们需要将响应发送回调用程序,例如,如果在线程B上重试,则成功状态线程a将等待线程B完成,因此线程a可能会超时。是否有任何方法使线程B异步?如果您使用集成服务,是否会有问题调用异步。A期望B返回一些东西,换句话说,A依赖于B的输出。由于B是异步运行的,所以A在不等待B的情况下返回。这将损害您的异常。如果集成服务没有返回任何内容。关系就像是一个只需整合服务并向前迈进的请求。换句话说,唯一重要的是,调用服务比期望从服务中得到回报更重要。在这种情况下,您可能会想到异步。