在这篇文章的最后 评论部分,有人提出了:我主要是不懂NettyRoutingFilter是在哪里切换线程的,因为它发出请求和接受反馈用的不是一个线程。麻烦回复一下。
我想问下: NettyRoutingFilter 中发送请求时 的线程和接收处理响应时的线程是同一个线程吗?
我的理解: 因为是响应式编程都是基于事件消息传递的,所以发送请求时 的线程 和 接收处理响应时的线程理论上 不会是同一个线程,都是消息来了从 线程池中取出一个线程来执行吧。
实际Debug时发现 两个线程的name相同
//框架执行线程
Flux<HttpClientResponse> responseFlux = getHttpClient(route, exchange).headers(headers -> {
headers.add(httpHeaders);
// Will either be set below, or later by Netty
headers.remove(HttpHeaders.HOST);
if (preserveHost) {
String host = request.getHeaders().getFirst(HttpHeaders.HOST);
headers.add(HttpHeaders.HOST, host);
}
}).request(method).uri(url).send((req, nettyOutbound) -> {
//发送请求时的线程 Thread.currentThread().getName()
if (log.isTraceEnabled()) {
nettyOutbound.withConnection(connection -> log.trace("outbound route: "
+ connection.channel().id().asShortText() + ", inbound: " + exchange.getLogPrefix()));
}
return nettyOutbound.send(request.getBody().map(this::getByteBuf));
}).responseConnection((res, connection) -> {
//处理响应时的线程 Thread.currentThread().getName()
// Defer committing the response until all route filters have run
// Put client response as ServerWebExchange attribute and write
// response later NettyWriteResponseFilter
exchange.getAttributes().put(CLIENT_RESPONSE_ATTR, res);
}