我正在学习更多关于使用Spring Webflux的知识,并尝试测试一个简单的异步Web服务调用。我看了几个例子,但我看不出我做错了什么。我有一个调用第三方API的服务,我想做的就是输出返回的Json响应。我“我还没有把响应转换成模型对象,但是如果我能先完成基本的工作,这将是下一步。代码不记录任何webservice调用的输出,并且我我也尝试过发送到System.out::println,但也不起作用。测试中的输出仅包括以下日志输出
023-01-04 00:53:46.622信息19938 --- [主] c.r.输入.服务.实施.列表服务实施:正在启动对Listly API的调用
2023年1月4日00:53:52.395信息19938 --- [主要] c.r.输入.服务.实施.列表服务实施:正在退出对Listly的服务调用
然而,当我把一个断点
listlyResponse.subscribe(listlyResp ->
log.info(listlyResp));
实际上我可以看到Web服务调用响应的正确内容。知道我做错了什么吗?这是代码
@Service
public class ListlyServiceImpl implements ListlyService {
private final static Logger log = LoggerFactory.getLogger(ListlyServiceImpl.class);
private final String baseUrl = "https://list.ly/api/v4";
@Override
public void callListlyService(String searchUrl) {
if (searchUrl == null) {
throw new RuntimeException("Search URL cannot be null");
}
log.info("Starting call to Listly API");
Mono<String> listlyResponse = WebClient.create(baseUrl)
.get()
.uri(uriBuilder -> uriBuilder
.path("/meta")
.queryParam("url","{url}")
.build(searchUrl))
.retrieve()
.bodyToMono(String.class);
listlyResponse.subscribe(listlyResp ->
log.info(listlyResp));
// listlyResponseFlux.subscribe(System.out::println);
log.info("Exiting service call to Listly");
}
}
我希望能够将Web服务调用的内容输出到日志输出,但由于某种原因,日志输出无法正常工作。
1条答案
按热度按时间jjjwad0x1#
没有看到整个项目就不清楚,因为我看不到你实际调用
callListlyService()
方法的地方,但是我可以看到你是从主线程调用它的。我认为您误解了React式范例。当您在React式链上调用
subscribe()
时,您应该知道链内可能会发生线程切换(取决于链上的操作符/可能执行线程切换的一些React式API)。在WebClient中,retrive()
默认从netty线程订阅,接下来的执行将在reactor-%s
线程上发生所以当你调用你的服务方法时,它会使subsribe()并立即返回,显示您记录
"Exiting service call to Listly"
,您的方法立即返回,因此您无法看到调用的结果。为了查看结果,您可以在React链上调用block()
,这将强制您的调用线程阻止并等待来自WebClient的响应。但不建议在reactor中使用此方法,因为您的“在真实的情况中,您应该从方法中返回Publisher<>
,例如,在需要/使用SpringWebFlux的地方自己订阅,在控制器方法中返回Publishers,将订阅过程留给WebFlux另一种方法只是为了实验的目的:你可以把
Thread.sleep(n)
放在你测试的末尾,这里n --你的主线程等待的时间,以米利斯为单位。这个时间应该比你实际的web调用要长