Java 为多个API调用配置spring引导重试
我有一个SpringBootAPI应用程序,它有一个POST端点,让我们调用它/doSomething作为方法 我需要将该数据保存在我们的应用程序上,然后需要对另一个api[A]发出GET请求。该请求必须从api[B]获取,然后再次发布到api[B]。在这种情况下,处理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=
@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的情况下返回。这将损害您的异常。如果集成服务没有返回任何内容。关系就像是一个只需整合服务并向前迈进的请求。换句话说,唯一重要的是,调用服务比期望从服务中得到回报更重要。在这种情况下,您可能会想到异步。