tomcat如何增大并发_Tomcat是如何处理并发请求的?

谢邀。

以下内容不保证绝对正确。

下面代码来自Tomcat8,大量使用了 java.util.concurrent 和 NIO的东西。

Tomcat也是一个Java程序嘛,那main方法是少不了的,位于Bootstrap类中

大概就长这个样子(所有的贴代码我就只是稍微贴一点意思一下就行了啊,因为实在是太多了)

这个main方法中还有下面这一截:

如果你这个command是start呢,他就会调用daemon的start()方法,通过上面可以知道这个daemon其实就是BootStrap对吧。

至于command的start是怎么来的呢

我们双击startup.bat去启动Tomcat的时候,会有一个黑窗口一闪而过,然后又出来一个黑窗口,然后从这个黑窗口里可以看到Tomcat的启动过程,把这个黑窗口关了之后,Tomcat也就停止运行了。startup.bat干了什么?

你把白色箭头的start改成run,再启动Tomcat就不会新开一个空窗口了哦。

然后再catalina.bat中有下面这一段,嗯,这就是去上面的BootStrap类的main方法就跑起来了,start也是这么进去的,当然,你如果不写的话,人家BootStrap默认认为你就是start,手动滑稽。

啊,我*,好像跑偏了。。。。。。

接着上面说,它会去调用BootStrap的start()方法

init()方法调用之后,catalinaDaemon就是Catalina类了,反射调用Catalina类的start()方法

这里面会弄出一个StandardServer对象(内部会使用Digester库去解析server.xml,那个里面的东西),并调用它的start()方法,把那些组件都启动起来。

其中在连接器的启动过程中,会弄出一个叫做endpoint的东西去和底层的网络IO打交道,会调用其bind()方法

这已经是Java NIO的东西了,这东西类似传统的ServerSocket,不能说类似,应该是说NIO中与之对应的东西。

然后(中间好多步呢),会执行这个endpoint的startInternal()方法,中间有这么一段

弄出了几个Poller类的实例(Poller实现了Runnable接口),并创建了新的线程,然后把这些线程跑起来。从上面的图中可以看到,Pollers的个数似乎有点少啊有没有感觉到,放心,它只负责接客,不干活。它的run方法长下面这样

这个很明显了嘛,死循环接收请求,然后去处理,处理完了循环回来再处理下一个。现在有两个问题:怎么接收的请求?这个地方又是怎么处理的?

Acceptor类。这个类实现了Runnable接口,自然的,会弄出一个线程,然后把它跑起来,它的run方法:

这个setSocketOptions方法主要有下面这几行,太多了,截图都不好截。。。

NioChannel channel = nioChannels.pop(); channel.setIOChannel(socket); channel.reset(); getPoller0().register(channel);

nioChannels你就当它是个容器,里面放了一堆的NioChannel就行了,从nioChannels中拿出一个,然后把socket给它,然后调用reset方法把它清理干净(这个很明显就是你这个请求用完了,下一个请求来了还用这个对吧,所以得清理干净,不然不卫生对吧),再然后getPoller0就是从上面的pollers中拿出一个Poller,然后把channel给它对吧。上面的Poller就是这么拿到请求的。

接下来看,Poller是怎么处理请求的

这个processKey里面东西很多啊,我们想看的是它会调用processSocket方法

这个executor是之前就弄好的

Tomcat就是上面这样处理的。

完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值