You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Webflux Router接口如何立即返回202并后台异步处理请求

Spring Webflux 异步处理POST请求并立即返回202响应的实现方案

问题根因分析

  • 第一种实现问题:单独对serverRequest.bodyToMono(Content.class)执行subscribe后立即返回响应,此时请求体还未完成读取,Webflux会直接释放请求连接和上下文,导致无法拿到完整的请求参数,因此只会打印onSubscribe和request日志,不会触发onNext。
  • 第二种实现问题:将同步处理逻辑拼接在响应返回的主流程中,then()操作符需要等待上游所有逻辑执行完成后才会生成响应,无论是否添加subscribeOn配置,都需要等待同步调用结束才会返回202,无法满足立即响应的要求。

正确实现方案

核心逻辑:先完成请求体读取(这是HTTP协议要求,开销极低仅为JSON反序列化),拿到参数后将处理逻辑提交到后台线程池异步执行,提交完成后立即返回响应,不需要等待处理逻辑执行结束。

@Log4j2
@Component
public class StreamingHandler {
    Mono<ServerResponse> process(ServerRequest serverRequest){
        // 先读取请求体,该步骤在响应返回前完成,避免请求上下文释放后无法读取参数
        return serverRequest.bodyToMono(Content.class)
                .doOnSuccess(content -> {
                    // 拿到请求参数后,将阻塞处理逻辑封装为异步任务提交到后台线程池
                    Mono.fromRunnable(() -> doSynchronousAPICall(content))
                            // 阻塞逻辑放到专门的弹性调度器,避免占用Netty IO线程
                            .subscribeOn(Schedulers.boundedElastic())
                            // 单独添加异常回调,避免后台异常被吞
                            .subscribe(null, e -> log.error("后台处理逻辑执行异常", e));
                })
                // 提交完异步任务后立即返回202,无需等待任务执行完成
                .then(ServerResponse.accepted().build());
    }
}

注意事项

  • 若请求体体积较大,读取请求体的时间会占用客户端等待时长,这是HTTP协议的固有特性:服务端必须接收完完整请求才能返回响应,该部分开销无法避免,若不需要解析请求参数可以直接返回202跳过读取步骤。
  • 若处理逻辑可靠性要求较高,建议引入消息队列中间件,收到请求后先将参数写入消息队列再返回202,由独立的消费者进程处理逻辑,避免服务重启导致未执行的后台任务丢失。

内容的提问来源于stack exchange,提问作者vinilpj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:24:02