设为首页 收藏本站
查看: 546|回复: 0

[经验分享] 浅析Tomcat之AbstractEndpoint

[复制链接]

尚未签到

发表于 2017-1-25 09:55:43 | 显示全部楼层 |阅读模式
Tomcat中的Connector将具体的协议处理托管给了不同的ProtocolHandler实现类.这些实现类都内置这一个很重要的对象,AbstractEndpoint这是一个抽象类,不同的协议需要提供不同的Endpoint.这个类的作用就是提供底层的网络I/O的处理.不同的ProtocolHandler所内置的Endpoint是不同的.但是AbstractEndpoint为这些类抽象出了一个具体的实现框架.
首先了解下AbstractEndpoint的一系列内部类(接口).Acceptor是其中职能最重要的,它是一个抽象类,拓展了Runable接口.从名字中可以很容易知道它的作用就是用来接收底层的Socket连接.而具体的实现就需要到具体的协议中去探究.比较重要的内部接口是Handler.它的作用是定义连接的处理.也就是后面被实现成各个版本是ConnectionHandler.
其次就是AbstractEndpoint的生命周期实现和一些功能方法.这些都跟上述的内部类实现息息相关.先看下类图.
http://www.lihongkun.com/wp-content/uploads/AbstractEndpoint1.jpg
从上图,我们可以了解,AbstractEndpoint有几个比较重要的属性.connectionLimitLatch是一个连接的锁存器,控制并发上限和等待队列,具体原理可见浅析Tomcat之LimitLatch.SocketProperties在这个类里面也派上了用场.内部定义的Acceptor在AbstractEndpoint是以数组的形式出现的.代表着一组连接接收器.maxConnections是最高的并连接数.此处设置的是默认值1000.executor是一个线程池.
接下来我们看下它的Lifecycle methods.中间有4个抽象方法.子类中必须实现,来实现不同的协议处理方式.而其他的编写方式也跟生命周期组件有所类似.

public abstract void bind() throws Exception;
public abstract void unbind() throws Exception;
public abstract void startInternal() throws Exception
public abstract void stopInternal() throws Exception;
protected abstract Acceptor createAcceptor();
public final void init() throws Exception {
if (bindOnInit) {
bind();
bindState = BindState.BOUND_ON_INIT;
}
}
public final void start() throws Exception {
if (bindState == BindState.UNBOUND) {
bind();
bindState = BindState.BOUND_ON_START;
}
startInternal();
}
protected final void startAcceptorThreads() {
int count = getAcceptorThreadCount();
acceptors = new Acceptor[count];
for (int i = 0; i < count; i++) {
acceptors = createAcceptor();
Thread t = new Thread(acceptors, getName() + "-Acceptor-" + i);
t.setPriority(getAcceptorThreadPriority());
t.setDaemon(getDaemon());
t.start();
}
}
public void pause() {
if (running && !paused) {
paused = true;
unlockAccept();
}
}
public final void stop() throws Exception {
stopInternal();
if (bindState == BindState.BOUND_ON_START) {
unbind();
bindState = BindState.UNBOUND;
}
}
public final void destroy() throws Exception {
if (bindState == BindState.BOUND_ON_INIT) {
unbind();
bindState = BindState.UNBOUND;
}
}

    init和start会调用bind方法,该方法是用来绑定Socket端口的(其实是SocketChannel,后面博文解释),startAcceptorThreads方法是用来启动底层网络I/O接收器的.这个在子类的startInternal中会被调用.pause方法是用unlockAccept来解除Acceptor的绑定.stop和destroy作用是解除它的Socket绑定,也就是不接受Soccket.
综上所述,AbstractEndpoint的作用是为底层网络连接提供一个实现的框架.它的实现方式是多样化的.
 
 
首发于泛泛之辈 - http://www.lihongkun.com/archives/110

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333174-1-1.html 上篇帖子: 浅析Tomcat之LimitLatch 下篇帖子: 浅析Tomcat之StandardHost
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表