Spring WebFlux源码学习笔记(二)

Spring WebFlux源码学习笔记(二)

继续前面的学习

先看看WebHandler

从前面的过程中我们知道,HttpHandler将Request请求最后交给了WebHandler去处理,我们先简单学习一下WebHandler的实现类

WebHandler实现类

在WebHandler的实现类里面包含了一个装饰器对象WebHandlerDecorator,HttpWebHandlerAdapter也是继承自它

ExceptionHandlingWebHandler

WebHandler装饰器调用一个或多个WebExceptionHandlers处理webHandle过程中的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
public Mono<Void> handle(ServerWebExchange exchange) {

Mono<Void> completion;
try {
completion = super.handle(exchange); //1
}
catch (Throwable ex) {
completion = Mono.error(ex);
}

for (WebExceptionHandler handler : this.exceptionHandlers) {
completion = completion.onErrorResume(ex -> handler.handle(exchange, ex)); //2
}

return completion;
}
  1. 调用父级的去处理请求
  2. 发生异常后进行异常解析

FilteringWebHandler

FilteringWebHandler使用一个WebFilterChain去处理ServerWebExchange

1
private final DefaultWebFilterChain chain;
1
2
3
4
5
6
@Override
public Mono<Void> filter(ServerWebExchange exchange) {
return Mono.defer(() ->
this.currentFilter != null && this.next != null ?
this.currentFilter.filter(exchange, this.next) :
this.handler.handle(exchange));

这里的handle实际上是DispatcherHandler

DispatcherHandler

DispatcherHandler应该是WebFlux核心的对象,在这里完成了对请求的处理。

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
if (this.handlerMappings == null) {
return createNotFoundError();
}
return Flux.fromIterable(this.handlerMappings) //1
.concatMap(mapping -> mapping.getHandler(exchange)) //2
.next() //3
.switchIfEmpty(createNotFoundError()) //4
.flatMap(handler -> invokeHandler(exchange, handler)) //5
.flatMap(result -> handleResult(exchange, result)); //6
}
  1. 将handlerMappings打包成一个广播对象
  2. 使用concatMap操作符收集mapping.getHandler(exchange)返回的对象。具体Handle过程我们后面再看。
  3. next()取出第一个对象
  4. 如果没有找到映射函数就广播一个异常Mono
  5. 调用业务代码函数处理请求
  6. 对业务代码结果进行处理

从WebHandlerDecorator开始

SpringWebFlux是怎么将这个过程串起来的呢?

首先,HttpWebHandlerAdapter将请求委派给 ExceptionHandlingWebHandler,ExceptionHandlingWebHandler收集并处理过程中的异常,它使用FilteringWebHandler来处理ServerWebExchange。

FilteringWebHandler本身也不处理ServerWebExchange,继续将任务交给了DispatcherHandler去执行。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×