Reactor中用.expand实现分页递归,blockLast仅返回最后结果的问题排查
问题原因与解决方法
核心问题
你用blockLast()只拿到最后一批结果是因为这个方法的设计就是等待Flux流结束后返回最后一个元素,而非收集所有批次的结果。
解决方案
1. 收集所有批次结果
如果需要一次性获取所有请求返回的ClientResponse,改用collectList().block(),它会把Flux中的所有元素收集成一个列表:
List<ClientResponse> allResponses = getAllData(id, startDate, endDate) .collectList() .block();
2. 逐个处理每批数据
如果不需要一次性阻塞等待全部结果,而是想实时处理每一批返回的数据,用subscribe()消费每个元素:
getAllData(id, startDate, endDate) .subscribe( response -> { // 在这里处理单批次数据,比如提取记录、写入数据库等 processBatchRecords(response); }, throwable -> { // 处理请求过程中的异常 System.err.println("获取数据出错: " + throwable.getMessage()); }, () -> { // 所有批次请求完成后的回调 System.out.println("所有数据获取完毕"); } );
额外注意点
检查你的getAllData方法参数:方法定义的参数是accountId,但调用client.getAllDataV2时用的是id,这大概率是笔误,会导致请求参数错误,记得修正为accountId:
private Flux<ClientResponse> getAllData(String accountId, String startDate,String endDate) { return client.getAllDataV2(accountId, startDate, endDate) .expand(response -> { String nextEndDate = response.getEndDate(); if (nextEndDate != null) { return getAllData(accountId, startDate, nextEndDate); }; return Flux.empty(); }); }
内容的提问来源于stack exchange,提问作者user641887
相关产品推荐
相关产品推荐

