How to wrap blocking IO operation for Webflux applicaiton(如何包装WebFlux应用程序的阻塞IO操作)
问题描述
我有一个Spring Boot/Webflow应用程序。我需要具有以下功能的异步REST终结点:
- 生成随机作业ID。
- 通过HTTP调用一个服务。
- 通过HTTP调用其他服务。
- 组合来自服务的响应并将结果写入文件。
- 将作业ID返回给客户端。
终结点应为异步。这就是为什么客户端不应该等待步骤2、3、4的结果。客户端应该立即收到作业ID。
目前我有以下实现:
@Override
public Mono<String> saveData() {
String jobId = UUID.randomUUID().toString();
Mono<ResponseFromService1> response1 = service1.getData();
Mono<ResponseFromService2> response2 = service2.getData();
return fileService.saveData(response1, response2)
.map(filePath -> log.info("File has been stored at {}", filePath))
.map(jobId);
Service1和Service2是使用Reactive WebClient实现的。 FileService.saveData的实现如下:
public Mono<Path> saveDataInFile(Mono<ResponseFromService1> response1,Mono<ResponseFromService2> response2) {
return Mono.fromCallable(() ->
Mono.zip(response1, response2)
.map(tuple -> blockingIOsaveMethod(tuple.getT1(), tuple.getT2()))
).publishOn(Schedulers.elastic())
.flatMap(mono -> mono);
}
问题是此终结点不是异步的。端点的客户端在保存包含数据的文件后获取作业ID。 我应该如何更新saveDataInFile和saveData以立即返回作业ID?
推荐答案
客户端应立即收到作业ID。
这似乎表明Mono<String>
不是saveData()
的正确返回类型,因为您显然不想等待任何异步操作完成:
@Override
public String saveData() {
String jobId = UUID.randomUUID().toString();
// ...
return jobId;
}
...
看起来像是一个<2-2]操作,您或许可以手动订阅Mono
:
@Override
public String saveData() {
String jobId = UUID.randomUUID().toString();
fileService.saveData(...).subscribe(...); // look at the different overloads of #subscribe(...)
return jobId;
}
确保所有内容都被记录在案,这样您就不会忘记返回HTTP响应后发生的事情。
这篇关于如何包装WebFlux应用程序的阻塞IO操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何包装WebFlux应用程序的阻塞IO操作


基础教程推荐
- 如何对 HashSet 进行排序? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01