tocmat中jsp热部署实现原理

我们知道在开发工程的时候jsp文件是即修改即生效的,由于比较好奇就研究了一下tomcat对于jsp热部署的实现原理,总结沉淀一下吧。Tomcat  jsp热部署的实现原理大体是这样的,每个JSP页面从上次访问到下次访问总是有默认几秒的缓存时间的,也就说并不是严格的即修改即生效,tocmat7默认是有4秒的缓存延迟的。这个默认的缓存延迟是在类EmbeddedServletOptions的private intmodificationTestInterval = 4;这个属性定义的。如果过了4秒缓存时间即失效,这个时候tomcat就会读取jsp的modified时间戳和work目录下编译好的class文件的modified的时间戳作对比。如果相等则class文件没有过期,则不会重新编译jsp文件,如果过期了则重新将jsp编译成java,并进一步编译成class。同时调用JasperLoader来重新加载这个有jsp编译好的class文件。下面具体分析一下这个过程:

大体的类通信时序图是这样的:


其中上文说的时间戳的校验逻辑主要封装在JDTCompiler的isOutDated方法里面,这个方法的主要源代码如下:


其中第一个红框就是涉及到的N秒缓存逻辑,如果缓存没有失效,则不会重新加载,这个ctxt.getOptions()获取到的其实是EmbeddedServletOptions类,这个类默认定义的时间间隔是:


在实验的时候我比较好奇就收到把这个值改为了40,果然jsp并没有及时生效,而是过了40秒之后才生效。第二个红框检测的是获取work目录下的class文件的对象。第三个红框就是比较class文件的时间戳和JSP文件的时间戳,如果不相等则重新编译加载(上面时序图的流程)。这个就是jsp的热部署流程!

原文:http://andy-li-chn.iteye.com/blog/1966986 公司的网站系统使用的间是jboss7.1.1 Final,由于有些数据和服务测试环境不具备,免不了要在测试环境调试些jsp页面,发现从jboss社区里下载的jboss应用有个问题,新增jsp页面会实时部署,修改过的jsp页面就无法正常部署。 最新查到了如下解决方式: 在jboss7\standalone\configuration\standalone.xml文件找到<subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host">做如下配置 Xml代码 收藏代码 <subsystem xmlns="urn:jboss:domain:web:1.0" default-virtual-server="default-host"> <configuration> <jsp-configuration development="true"/> </configuration> <connector name="http" protocol="HTTP/1.1" socket-binding="http" scheme="http"/> <virtual-server name="default-host" enable-welcome-root="true"> <alias name="localhost"/> <alias name="example.com"/> </virtual-server> </subsystem> 以打开开发模式。但是加上该代码后,发现不起作用。后面有到jboss社区里翻了无数帖子,发现了Tomaz Cerar如下描述: in 7.1.1 we have included much reworked web subsystem but unfortunaly I missed a bit that coused all jsp configuration to be ignored. That bug was fixed soon after 7.1.1 was released and is now part of 7.1.2 and 7.2.x development branch. 原味连接https://community.jboss.org/message/723813由此可见这是一个本版本的bug,说是要在后期修复的。但是为间升级风险很大,很多业务都是基于老版本的开发的,为了稳妥,我想肯定有人不用通过升级已经解决了此问题。 灯火阑珊处,发现了答案: 1. Please make sure to add <configuration> <jsp-configuration development="true"/> </configuration> in standalone.xml under <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false"> 2. Go to jboss-as-7.1.1.Final/modules/org/jboss/as/web/main Place the jboss-as-web-7.1.1.Final-RECOMPILE.jar in there. You can download from http://www.datafilehost.com/download-2cb9ff04.html 3. Open module.xml (jboss-as-7.1.1.Final/modules/org/jboss/as/web/main) and add the following line <!--resource-root path="jboss-as-web-7.1.1.Final.jar"/--> <resource-root path="jboss-as-web-7.1.1.Final-RECOMPILE.jar"/> 叙述的都很简单,我就不翻译了 原文详见:https://community.jboss.org/message/723945#723945#723945 按照作者所讲的方法操作了,问题奇迹般解决了,当时由于jboss核心包被重新编译过了,是否存在什么隐患还有待深入测试。 另在附件提供了解决方案提供者重新编译过的包,我测试了是没问题。 现与大家分享。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值