SpringBoot中如何批量向REST api提交请求?

问题描述 投票:0回答:1

我有一个批量请求对象的列表,例如

List<BulkRequests> bulkRequest;

我想将它们一一提交到外部 REST API 我已经为此构建了一个 FiegnClient。 有没有优化的方式来逐一提交(仅当最后一个成功时才提交下一个或以反应方式提交)? 批量请求类是这样的。

class BulkRequest {
  String traceId;
  List<MyRequest> myRequests;
}
java spring-boot rest spring-webflux flux
1个回答
0
投票

为此,您可能应该采用反应式方法来发送批量请求。

考虑到您假装客户端已经实现或看起来像这样:

@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);
    }
}

请记住,您可能还需要通过实现错误和重试事件来处理错误处理和重试机制。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.