我有一个批量请求对象的列表,例如
List<BulkRequests> bulkRequest;
我想将它们一一提交到外部 REST API 我已经为此构建了一个 FiegnClient。 有没有优化的方式来逐一提交(仅当最后一个成功时才提交下一个或以反应方式提交)? 批量请求类是这样的。
class BulkRequest {
String traceId;
List<MyRequest> myRequests;
}
为此,您可能应该采用反应式方法来发送批量请求。
考虑到您假装客户端已经实现或看起来像这样:
@Service
public class RequestService {
private final ExternalAPIFeignClient externalAPIFeignClient;
@Autowired
public RequestService(ExternalAPIFeignClient externalAPIFeignClient) {
this.externalAPIFeignClient = externalAPIFeignClient;
}
public Flux<ResponseEntity<?>> sendRequestsInBatch(List<BulkRequest> bulkRequests) {
return Flux.fromIterable(bulkRequests)
.flatMapSequential(request -> externalAPIFeignClient.sendRequest(request));
}
}
主要要做的事情如下。
配置我的批量请求服务。
映射我批次中的所有请求
使用 Flux 或 MonoFlux 反应式方法批量发送它们。
@Service
public class RequestService {
private final ExternalAPIFeignClient externalAPIFeignClient;
@Autowired
public RequestService(ExternalAPIFeignClient externalAPIFeignClient) {
this.externalAPIFeignClient = externalAPIFeignClient;
}
public Flux<ResponseEntity<?>> sendRequestsInBatch(List<BulkRequest> bulkRequests) {
return Flux.fromIterable(bulkRequests)
.flatMapSequential(request -> externalAPIFeignClient.sendRequest(request));
}
}
fromIterable
创建反应式流,并且 flatMapSequential
确保序列一个接一个地执行。
您的控制器应该如下所示:
@RestController
@RequestMapping("/api")
public class RequestController {
private final RequestService requestService;
@Autowired
public RequestController(RequestService requestService) {
this.requestService = requestService;
}
@PostMapping("/bulk-requests")
public Flux<ResponseEntity<?>> sendBulkRequests(@RequestBody List<BulkRequest> bulkRequests) {
return requestService.sendRequestsInBatch(bulkRequests);
}
}
请记住,您可能还需要通过实现错误和重试事件来处理错误处理和重试机制。