前言
上一篇已经分析了SpringBoot下,WebFlux的启动流程,我们本篇将接上篇分析一下WebFlux的请求处理流程。在上篇末尾处我们提到HttpServer中有个HttpServerHandle的内部类,实现了监听请求状态变化的接口,请求处理流程的分析也将从此处开始。
HttpServerHandle - onStateChange():监听请求状态变化
package reactor.netty.http.server;
import...
public abstract class HttpServer extends ServerTransport<HttpServer, HttpServerConfig> {
final BiFunction<? super HttpServerRequest, ? super HttpServerResponse, ? extends Publisher<Void>> handler;
...
static final class HttpServerHandle implements ConnectionObserver {
...
@Override
@SuppressWarnings("FutureReturnValueIgnored")
public void onStateChange(Connection connection, State newState) {
/**
* CONNECTED:连接已建立并且可用
* CONFIGURED:连接已绑定并已准备好交互
* ACQUIRED:连接已获得(长连接或连接池)
* RELEASED:连接已释放,但未完全关闭(长连接或连接池)
* DISCONNECTING:连接完全关闭
* REQUEST_RECEIVED:请求已接收
* REQUEST_DECODING_FAILED:收到请求但解析失败
*/
if (newState == HttpServerState.REQUEST_RECEIVED) {
try {
if (log.isDebugEnabled()) {
log.debug(format(connection.channel(), "Handler is being applied: {}"), handler);
}
/**
* 转成子类,
* 关系:HttpServerOperations -> HttpOperations -> ChannelOperations -> Connection
*/
HttpServerOperations ops = (HttpServerOperations) connection;
/**
* 通过上篇我们知道这里的handler实际是ReactorHttpHandlerAdapter,实现BiFunction接口
* 这里也就是ReactorHttpHandlerAdapter.apply(HttpServerRequest, HttpServerResponse)
* 详见1.1
*/
Publisher<Void> publisher = handler.apply(ops, ops);
/**
* Mono.deferContextual 获取Context对象,将Context赋值给ops,
* ops类型为HttpServerOperations,同时父类ChannelOperations实现CoreSubscriber接口
* 即实现Reactive模式里的onSubscribe()、onNext()、onError()、onComplete(),及currentContext()方法
*/
Mono<Void> mono = Mono.deferContextual(ctx -> {
ops.currentContext = Context.of(ctx);
// 最后转换产生Mono
return Mono.fromDirect(publisher);
});
if (ops.mapHandle != null) {
mono = ops.mapHandle.apply(mono, connection);
}
// 订阅,执行FilteringWebHandler.filter()内的Mono.defer(),下篇再做分析。
mono.subscribe(ops.disposeSubscriber());
}
catch (Throwable t) {
log.error(format(connection.channel(), ""), t);
//"FutureReturnValueIgnored" this is deliberate
connection.channel()
.close();
}
}
}
}
}
1.1 ReactorHttpHandlerAdapter - apply()
package org