reactive-programming - Webflux Router 立即返回 202 并继续处理
问题描述
我是 Webflux 的新手,正在尝试使用 spring webflux 构建应用程序。我公开了一个 http post 端点,它接受一个 json 并立即返回 202 并开始在后台处理请求。这没有按预期工作,我立即得到 202 但单声道处理没有发生
@Configuration
public class StreamingRouter {
@Bean
RouterFunction<ServerResponse> streamProcessor(StreamingHandler handler) {
RouterFunction<ServerResponse> streamRouter = RouterFunctions.route(
RequestPredicates.POST("/stream").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
handler::process);
return streamRouter;
}
}
@Log4j2
@Component
public class StreamingHandler {
Mono<ServerResponse> process(ServerRequest serverRequest){
serverRequest.bodyToMono(Content.class)
.log
.subscribe(log::info);
return ServerResponse.accepted().build();
}
}
2021-06-27 09:21:44.576 INFO 14076 --- [ctor-http-nio-3] reactor.Mono.OnErrorResume.1 : onSubscribe(FluxOnErrorResume.ResumeSubscriber)
2021-06-27 09:21:44.577 INFO 14076 --- [ctor-http-nio-3] reactor.Mono.OnErrorResume.1 : request(unbounded)
onNext 在调用订阅后没有发生。
如果我更改为在它执行的同一语句中返回,但 202 在处理后发生在同一线程中。
return serverRequest.bodyToMono(Content.class)
.log()
.map(content -> doSynchronousAPICall)
.then(ServerResponse.accepted().build());
我也试过subscribeOn(Schedulers.boundedElastic())
但不是运气。我想我在这里遗漏了一些东西。请帮忙
更新 按照建议,我尝试了 doOnSuccess,但结果与地图相同。
return serverRequest.bodyToMono(Content.class)
.log()
.doOnSuccess(content -> doSynchronousAPICall)
.then(ServerResponse.accepted().build());
我在同一语句中返回的问题与阻塞调用 [doSynchronousAPICall] 花费相同的时间发送响应为 202/Accepted。即说响应 202 需要 3 秒。相反,我正在寻找的是立即返回并继续处理。客户只想知道已达到的请求。
解决方案
推荐阅读
- javascript - mongodb:从数组中删除一个对象
- scala - 值映射不是 int 的成员
- java - 使用 BufferedWriter/Reader 添加行数
- c# - 我将如何启动 Garry's Mod 并在启动时连接到地址?
- react-native - FlatList 在加载或刷新数据时锁定点击
- reactjs - 使用异步操作时 React-Redux 组件测试失败
- django - Django:work() 缺少 1 个必需的位置参数:'project_id'
- haskell - 实施 Bresenham 算法
- python - 康达更新使python崩溃
- rust - 为什么在将 tokio_io 的 read_exact 与 Rc 一起使用时会出现“溢出评估要求‘Sized’”
?