首页 > 解决方案 > 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 秒。相反,我正在寻找的是立即返回并继续处理。客户只想知道已达到的请求。

标签: reactive-programmingspring-webfluxproject-reactor

解决方案


推荐阅读