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

[经验分享] 浅析Tomcat之Connector

[复制链接]

尚未签到

发表于 2017-1-28 14:38:29 | 显示全部楼层 |阅读模式
Tomcat7默认连接器是类org.apache.catalina.connector.Connector.连接器的作用是等待引入的HTTP请求,创建request对象和response对象,然后调用org.apache.catalina.Container接口的invoke方法将request和response传递给servlet容器.在invoke方法内部,servlet容器会载入相应的servlet类,调用其service方法,管理session对象,记录错误消息等操作.
Connector类继承了LifecycleMBeanBase.其设计思想跟StandardServer等类似.控制其内置组件的生命周期,在生命周期内对外提供服务.它是受StandardService生命周期控制的.我们可以看下service的初始化方法.

protected void initInternal() throws LifecycleException {
super.initInternal();
if (container != null) {
container.init();
}
// Initialize any Executors
for (Executor executor : findExecutors()) {
if (executor instanceof LifecycleMBeanBase) {
((LifecycleMBeanBase) executor).setDomain(getDomain());
}
executor.init();
}
// Initialize our defined Connectors
synchronized (connectors) {
for (Connector connector : connectors) {
try {
connector.init();
} catch (Exception e) {
String message = sm.getString(
"standardService.connector.initFailed", connector);
log.error(message, e);
if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE"))
throw new LifecycleException(message);
}
}
}
}

   我们可以看到StandardService初始化是调用了容器的初始化,Excuctor的初始化和Connector的初始化.而Connector的责任是根据自身的协议操作来接收不同类型的网络连接.它有2个比较重要的属性,protocolHandlerClassName和protocolHandler.前者是字符串类型,来说明后者的具体实现类.ProtocolHandler是一个接口.它定义了了具体网络协议连接的操作.protocolHandlerClassName有一个默认值.而protocolHandler是在Connector构造函数中初始化的.其中调用了一个比较重要的方法setProtocol,它是用来设置protocolHandlerClassName的.

public Connector(String protocol) {
setProtocol(protocol);
// Instantiate protocol handler
try {
Class<!--?--> clazz = Class.forName(protocolHandlerClassName);
this.protocolHandler = (ProtocolHandler) clazz.newInstance();
} catch (Exception e) {
log.error(sm.getString(
"coyoteConnector.protocolHandlerInstantiationFailed"), e);
}
}
public void setProtocol(String protocol) {
if (AprLifecycleListener.isAprAvailable()) {
if ("HTTP/1.1".equals(protocol)) {
setProtocolHandlerClassName
("org.apache.coyote.http11.Http11AprProtocol");
} else if ("AJP/1.3".equals(protocol)) {
setProtocolHandlerClassName
("org.apache.coyote.ajp.AjpAprProtocol");
} else if (protocol != null) {
setProtocolHandlerClassName(protocol);
} else {
setProtocolHandlerClassName
("org.apache.coyote.http11.Http11AprProtocol");
}
} else {
if ("HTTP/1.1".equals(protocol)) {
setProtocolHandlerClassName
("org.apache.coyote.http11.Http11Protocol");
} else if ("AJP/1.3".equals(protocol)) {
setProtocolHandlerClassName
("org.apache.coyote.ajp.AjpProtocol");
} else if (protocol != null) {
setProtocolHandlerClassName(protocol);
}
}
}

   从上面的代码设计中,不难猜出Connector根据不同的protocol来实例化不同的ProtocolHandler其对不同网络类型的连接就托管到ProtocolHandler中了.事实上就是如此,不同协议的连接管理分散到不同ProtocolHandler的生命周期中去.Connector起到了facade的作用.
 
 
首发于泛泛之辈 - http://www.lihongkun.com/archives/97

运维网声明 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-334576-1-1.html 上篇帖子: tomcat去除项目名访问 下篇帖子: 浅析Tomcat之JIoEndpoint
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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