为多个 API 调用配置 spring 引导重试
Configure spring boot retry for multiple API calls
我有一个 spring 启动 api 应用程序,它有一个 POST 端点,让我们将它称为 /doSomething 作为方法。当接收到 /doSomething 端点的请求时
我需要将该数据保存在我们的应用程序中,然后需要为另一个 api[A] 发出 GET 请求,该请求必须从 API[B] 获取,然后再次必须 post 到 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 class
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 应用重试,是否会对应用程序的主要部分产生性能影响ex.for 在主要端点上保存数据。
什么是最佳实践
标记为 @Retryable
的方法通过阻止当前正在执行的线程在单独的线程中调用。
就您的代码预期而言,
正在线程(比如线程 A)中进行保存,并且正在其他线程(比如线程 B)中处理集成服务。因此,线程 A 被阻塞,直到 B 完成。因此 integrationServiceBean.processCourseMetaData("_id");
的下一行被阻塞,直到由于成功或重试限制耗尽而完成。
回答你的问题。
保存数据未受影响。所以我认为不会影响性能。
谈论最佳实践
每当服务之间存在网络分区时,使用重试是一种很好的做法。
它使应用程序健壮。
我有一个 spring 启动 api 应用程序,它有一个 POST 端点,让我们将它称为 /doSomething 作为方法。当接收到 /doSomething 端点的请求时 我需要将该数据保存在我们的应用程序中,然后需要为另一个 api[A] 发出 GET 请求,该请求必须从 API[B] 获取,然后再次必须 post 到 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 class
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 应用重试,是否会对应用程序的主要部分产生性能影响ex.for 在主要端点上保存数据。
什么是最佳实践
标记为 @Retryable
的方法通过阻止当前正在执行的线程在单独的线程中调用。
就您的代码预期而言,
正在线程(比如线程 A)中进行保存,并且正在其他线程(比如线程 B)中处理集成服务。因此,线程 A 被阻塞,直到 B 完成。因此 integrationServiceBean.processCourseMetaData("_id");
的下一行被阻塞,直到由于成功或重试限制耗尽而完成。
回答你的问题。
保存数据未受影响。所以我认为不会影响性能。
谈论最佳实践
每当服务之间存在网络分区时,使用重试是一种很好的做法。 它使应用程序健壮。