我有一个关于Spring Reactive WebClient的问题...几天前,我决定使用Spring Framework中的新的React东西,并且我做了一个小项目,仅出于个人目的抓取数据。(对一个网页发出多个请求并合并结果)。
我开始使用新的反应式WebClient发出请求,但发现的问题是客户端未针对每个请求发出响应。听起来很奇怪。这是我为获取数据所做的:
private Mono<String> fetchData(String uri) {
return this.client
.get()
.uri(uri)
.header("X-Fsign","SW9D1eZo")
.retrieve()
.bodyToMono(String.class)
.timeout(Duration.ofSeconds(35))
.log("category", Level.ALL, SignalType.ON_ERROR, SignalType.ON_COMPLETE, SignalType.CANCEL, SignalType.REQUEST);
}
Run Code Online (Sandbox Code Playgroud)
和调用的函数fetchData:
public Mono<List<Stat>> fetch() {
return fetchData(URL)
.map(this::extractUrls)
.doOnNext(System.out::println)
.doOnNext(s-> System.out.println("all ids are "+s.size()))
.flatMapIterable(q->q)
.map(s -> s.substring(7, 15))
.map(s -> "http://d.flashscore.com/x/feed/d_hh_" + s + "_en_1") // list of N-length urls
.flatMap(this::fetchData)
.map(this::extractHeadToHead)
.collectList();
}
Run Code Online (Sandbox Code Playgroud)
和订户:
FlashScoreService bean = ctx.getBean(FlashScoreService.class);
bean.fetch().subscribe(s->{
System.out.println("finished !!! " + s.size()); //expecting same N-length list size
},Throwable::printStackTrace);
Run Code Online (Sandbox Code Playgroud)
问题是如果我发出的请求多于100个,那么我没有得到所有响应,没有错误抛出,或者返回了错误响应代码,并以与请求数量不同的大小调用了subscription方法。 …