gpt4 book ai didi

java - 为多个 API 调用配置 spring boot 重试

转载 作者:行者123 更新时间:2023-11-30 07:02:19 27 4
gpt4 key购买 nike

我有一个 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"); 的下一行将被阻塞,直到成功完成或重试限制耗尽为止。

回答你的问题。

保存数据未受影响。所以我认为,性能不会受到任何影响。

谈论最佳实践

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

关于java - 为多个 API 调用配置 spring boot 重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40718158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com