Browse Source

feat(api): 添加批量重试IFS接口调用功能

- 在IfsCallErrorLogController中新增batchRetry接口支持批量重试操作
- 在IfsCallErrorLogData实体类中添加ids字段用于接收批量操作ID列表
- 在IfsCallErrorLogService中定义batchRetryIfsCall方法接口
- 在IfsCallErrorLogServiceImpl中实现批量重试逻辑,按创建时间排序执行
- 添加重试间隔控制避免并发问题,每次重试间隔0.1秒
- 实现重试结果统计返回成功和失败数量信息
master
常熟吴彦祖 5 months ago
parent
commit
8073c70137
  1. 23
      src/main/java/com/gaotao/modules/api/controller/IfsCallErrorLogController.java
  2. 6
      src/main/java/com/gaotao/modules/api/entity/IfsCallErrorLogData.java
  3. 10
      src/main/java/com/gaotao/modules/api/service/IfsCallErrorLogService.java
  4. 98
      src/main/java/com/gaotao/modules/api/service/impl/IfsCallErrorLogServiceImpl.java

23
src/main/java/com/gaotao/modules/api/controller/IfsCallErrorLogController.java

@ -130,4 +130,27 @@ public class IfsCallErrorLogController extends AbstractController {
ifsCallErrorLogService.closeRetry(data.getId(), processedBy);
return R.ok();
}
/**
* @Description 批量重试IFS接口调用 - rqrq
* @Title batchRetry
* @param data 包含ids列表
* @return R
* @author rqrq
* @date 2026/01/21
*/
@PostMapping("/batchRetry")
public R batchRetry(@RequestBody IfsCallErrorLogData data) {
try {
String processedBy = getUser().getUsername();
java.util.Map<String, Integer> result = ifsCallErrorLogService.batchRetryIfsCall(data.getIds(), processedBy);
return R.ok()
.put("successCount", result.get("successCount"))
.put("failCount", result.get("failCount"))
.put("msg", "批量重试完成");
} catch (Exception e) {
logger.error("批量重试IFS接口调用失败", e);
return R.error("批量重试失败:" + e.getMessage());
}
}
}

6
src/main/java/com/gaotao/modules/api/entity/IfsCallErrorLogData.java

@ -46,4 +46,10 @@ public class IfsCallErrorLogData extends IfsCallErrorLog {
@TableField(exist = false)
private Integer pageSize;
/**
* 批量重试的ID列表 - rqrq
*/
@TableField(exist = false)
private java.util.List<Long> ids;
}

10
src/main/java/com/gaotao/modules/api/service/IfsCallErrorLogService.java

@ -78,4 +78,14 @@ public interface IfsCallErrorLogService extends IService<IfsCallErrorLog> {
boolean retryIfsCall(Long id, String processedBy);
void closeRetry(Long id, String processedBy);
/**
* @Description 批量重试IFS接口调用按created_at从早到晚顺序执行每次间隔0.1秒- rqrq
* @param ids 错误日志ID列表
* @param processedBy 操作人
* @return java.util.Map 包含successCount和failCount
* @author rqrq
* @date 2026/01/21
*/
java.util.Map<String, Integer> batchRetryIfsCall(java.util.List<Long> ids, String processedBy);
}

98
src/main/java/com/gaotao/modules/api/service/impl/IfsCallErrorLogServiceImpl.java

@ -353,4 +353,102 @@ public class IfsCallErrorLogServiceImpl extends ServiceImpl<IfsCallErrorLogMappe
return domainUserID;
}
/**
* @Description 批量重试IFS接口调用按created_at从早到晚顺序执行每次间隔0.1秒- rqrq
* @param ids 错误日志ID列表
* @param processedBy 操作人
* @return java.util.Map 包含successCount和failCount
* @author rqrq
* @date 2026/01/21
*/
@Override
public java.util.Map<String, Integer> batchRetryIfsCall(java.util.List<Long> ids, String processedBy) {
System.out.println("========== 批量重试IFS接口调用开始 ==========");
System.out.println("待重试数量: " + ids.size() + ", 操作人: " + processedBy);
int successCount = 0;
int failCount = 0;
// 1. 查询所有待重试的记录 - rqrq
java.util.List<IfsCallErrorLog> errorLogs = this.listByIds(ids);
if (errorLogs == null || errorLogs.isEmpty()) {
System.out.println("未找到待重试的记录");
java.util.Map<String, Integer> result = new java.util.HashMap<>();
result.put("successCount", 0);
result.put("failCount", 0);
return result;
}
// 2. 按created_at从早到晚排序 - rqrq
errorLogs.sort((a, b) -> {
if (a.getCreatedAt() == null && b.getCreatedAt() == null) return 0;
if (a.getCreatedAt() == null) return 1;
if (b.getCreatedAt() == null) return -1;
return a.getCreatedAt().compareTo(b.getCreatedAt());
});
System.out.println("排序后记录数: " + errorLogs.size());
// 3. 逐个执行重试 - rqrq
for (int i = 0; i < errorLogs.size(); i++) {
IfsCallErrorLog errorLog = errorLogs.get(i);
System.out.println("正在重试第 " + (i + 1) + "/" + errorLogs.size() + " 条,ID: " + errorLog.getId());
// 检查状态只重试PENDING状态的记录 - rqrq
if (!"PENDING".equals(errorLog.getProcessStatus())) {
System.out.println("跳过非PENDING状态的记录,当前状态: " + errorLog.getProcessStatus());
continue;
}
// 执行重试 - rqrq
boolean success = retryCallIfsInterface(errorLog, processedBy);
// 更新记录状态 - rqrq
if (success) {
errorLog.setProcessStatus("PROCESSED");
errorLog.setProcessedAt(new java.util.Date());
errorLog.setProcessedBy(processedBy);
errorLog.setRemark("批量重试成功");
errorLog.setUpdatedAt(new java.util.Date());
this.updateById(errorLog);
successCount++;
System.out.println("第 " + (i + 1) + " 条重试成功");
} else {
Integer currentRetry = errorLog.getRetryCount() != null ? errorLog.getRetryCount() : 0;
errorLog.setRetryCount(currentRetry + 1);
errorLog.setUpdatedAt(new java.util.Date());
if (errorLog.getRetryCount() >= errorLog.getMaxRetry()) {
errorLog.setProcessStatus("IGNORED");
errorLog.setProcessedAt(new java.util.Date());
errorLog.setProcessedBy("SYSTEM");
errorLog.setRemark("批量重试超过最大重试次数(" + errorLog.getMaxRetry() + "),自动忽略");
}
this.updateById(errorLog);
failCount++;
System.out.println("第 " + (i + 1) + " 条重试失败");
}
// 间隔0.1秒避免并发问题 - rqrq
if (i < errorLogs.size() - 1) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("批量重试被中断");
break;
}
}
}
System.out.println("批量重试完成,成功: " + successCount + ", 失败: " + failCount);
System.out.println("========== 批量重试IFS接口调用结束 ==========");
java.util.Map<String, Integer> result = new java.util.HashMap<>();
result.put("successCount", successCount);
result.put("failCount", failCount);
return result;
}
}
Loading…
Cancel
Save