Spring Webflux WebFilter会话管理:移除block()实现非阻塞获取会话
移除WebFilter中的block(),实现非阻塞会话处理
嘿,我来帮你搞定这个WebFlux里的block()问题!首先得说,在WebFlux这种响应式框架里用block()绝对是反模式——它会硬生生阻塞当前线程,直接废掉WebFlux非阻塞、高并发的优势,搞不好还会导致线程池耗尽的问题。
咱们直接重构代码,用响应式的链式调用替换掉阻塞操作:
public class DemoFilter implements WebFilter { @Override public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) { // 用flatMap异步处理会话,全程不阻塞 return serverWebExchange.getSession() .flatMap(webSession -> { // 会话拿到后再设置属性 webSession.getAttributes().put("attribute", attributeValue); // 继续走过滤链 return webFilterChain.filter(serverWebExchange); }); } }
为啥这么改?
serverWebExchange.getSession()返回的是Mono<WebSession>,这是个异步结果容器,flatMap能帮我们在会话异步就绪后,再执行后续的属性设置和过滤链调用- 整个流程从头到尾都是非阻塞的链式调用,完美契合WebFlux的响应式编程模型,不会占用线程做等待的活儿
另外补充个小细节:如果你的attributeValue本身也是个异步值(比如Mono<String>),那得再嵌套一层flatMap或者map来处理,确保所有操作都不阻塞。举个例子:
// 假设attributeValue是Mono<String>类型 return serverWebExchange.getSession() .flatMap(webSession -> attributeValue .map(value -> { webSession.getAttributes().put("attribute", value); return webSession; })) .then(webFilterChain.filter(serverWebExchange));
这样整个过滤流程就完全是异步非阻塞的啦~
内容的提问来源于stack exchange,提问作者Sancho
相关产品推荐
相关产品推荐

