Tomcat 接收请求并传递给工作线程池流程


Tomcat 接收请求并传递给工作线程池流程

接收 socket 连接

  • 有两个线程 http-nio-8080-ClientPoller-0/1 (下文称为 clientPoller)一直在运行 org.apache.tomcat.util.net.NioEndpoint.Poller.run() 的 run 方法,processKey(sk, attachment); 中attachment 即为 SelectionKey 中获取到的 socket ;
  • org.apache.tomcat.util.net.AbstractEndpoint 持有 private Executor executor 是一个工作线程池的引用;调用 其 executor.execute(sc); 即可将 socket 传递给工作线程池;
  • 工作线程池 等待在阻塞队列 LinkedBlokingQueue 的 getTask :workQueue.take(); 方法,当有任务后立即执行;
  • RMI 为前缀的线程 只是共用了 并发包的线程池, 可能会影响debug;
  • org.apache.tomcat.util.net.SocketProcessorBase reset 方法中直接打断点,可跟踪接收线程;
  • java.util.concurrent.ThreadPoolExecutor. runWorker 方法 task.run(); 打断点或业务代码打断点跟踪栈帧 可跟踪工作线程流程;

org.apache.tomcat.util.net.SocketProcessorBase#reset

 public void reset(SocketWrapperBase<S> socketWrapper, SocketEvent event) {
        Objects.requireNonNull(event);
        this.socketWrapper = socketWrapper;
        this.event = event;
}

结论

  • 两组 线程池传递数据,使用的是 LinkedBlokingQueue;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值