使用Tomcat的Reload提高开发速度(翻译)
欢迎转载http://www.cnblogs.com/coodream2009,有翻译的不太准确的地方请大家指出,我继续修改完善。
按照Java Servlet规范第四部分推荐的,Tomcat系统的实现了reload Java类来进行应用的部分更新,而不用重新启动整个服务器。
这个特性对于开发来说非常重要,因为随着服务器启动和重新启动的时间得增加,对开发者产出有着严重的影响。事实上,不论是个人项目还是企业级项目,Java EE栈应用服务器重启时间比较慢是导致Tomcat广泛应用的原因之一。
然而,即便Tomcat不能快速启动,它还是能够在运行中reload一个应用。通过仅仅加载独立应用中改变的类,开发者能在几秒内而不是几分钟内获得新功能的启动和运行。
(本段为Tcat的广告时间)Tcat的中心管理控制台让您深刻了解web应用程序的性能。可靠的停止、启动、部署和解部署应用,通过email、电话或者更多的途径获得自定义报警。马上下载Tcat吧。
在这篇文章中,我们将针对所有的不同的机制,提供合理配置和Tomcat实例加载应用程序和java类,包括:
通过服务器重启reload
利用Tomcat管理器手动reload
通过Context设置热reload
利用WatchedResources参数热reload
利用集成开发环境如eclipse热reload
对于为什么在生产环境不应该使用自动加载,我们也说明了一些原因,并由一些解决建议。
如何进行reload工作
在我们开始之前,让我们快速的定义几个在文章中用到的术语,以避免歧义。
本文中,你会看到reloading和redeploying应用程序,尽管他们都是服务器用于处理应用程序的变化,这两个术语并不能互换。
对Apache Tomcat服务器来说,reload一个应用程序意味着在一个给定的Context上调用Standard Context类的一个方法,方法名称是StandardContext.reload() 。这个方法创建了一个新的类加载器和新的servlets,回收了旧的servlets所有的引用,然后在servlet上调用servlet.init()方法,给servlet一个初始化状态,通过新的类加载器触发所有类和库的reload。
相比之下,reployment意味着先从部署目录全部删除这个应用程序,然后在服务器的appBase目录重新部署。
关于服务器重启的单词
最基础的,零失误reload web应用程序的方式就是重新启动Tomcat服务器。如果你在服务器上运行多个应用程序,这种重启的方法尽管慢而且有些麻烦,在很多情况下完全的服务器重启来reload你的应用程序是最合适的方法。
这些特殊的场景包括你的应用程序有多部分组成,这些组成部分必须在Catalina的server.xml文件中配置,比如GlobalNamingResources,或者你对你的docBase使用了符号链接来设置应用程序配置。
重启Tomcat服务器也是停止和重启你的应用程序的一种方式,它允许reload一些元素比如web.xml文件(尽管重启这些文件的方式无需停止服务)。
通过Tomcat Manager进行reload
Tomcat Manager,是一个包含所有标准分布的Tomcat的web应用程序,有能力reload web应用程序(比如启动、停止、部署和解除部署它们),即使用用程序的Context没有被设置为“reloadable”。在生产环境中reload一个应用程序,将Tomcat的自动reload特性设置为禁止,是特别有用的,否则在低性能的环境中自动reload会引起内存问题。
Tomcat Manager一旦正确设置,它就能通过web控制台http:/{host}:{port}/manager/html来访问,或者通过多个基于URI的命令公开脚本功能。
从web控制台reload一个应用程序,导航到“应用程序列表”选项卡。你可以从服务器部署的所有应用程序中选择一个应用程序去reload。通过URI命令reload一个应用程序,使用如下的格式:
http:/[hostname]:[port]/manager/reload?path=[/path/to/your/webapp]
即使你没有声明你的应用程序Context是reloadable的,这些命令也可以使用。需要注意的是,截至到Tomcat6.0.26版本,这种方式管理应用程序不能reload那些部署为war包文件的应用程序,只能管理部署为文件夹的应用程序。
使用Manager来reload以war包部署的已经产生变化的应用程序,你可以先解除部署然后再重新部署它。Tomcat Manager也不能用于reload发生变化的web.xml文件。为了实现这种变化而不重新启动整个服务器,使用Manager简单的停止然后启动这个应用程序。换一种方式,你也可以用WatchedResources来设置这些文件。
出于明显的安全原因,Tomcat Manager默认是禁止的,打开它需要进行多个Tomcat设置。
要获取使用Tomcat Manager的reload功能和配置的详细指导,还有一些其它的特性,需要访问Tomcat Manager文章(https://www.mulesoft.com/cn/tomcat-manager)。
通过Context settings来进行热reload
在开发的面向细节的阶段,比如优化阶段,频繁的进行小的改动很必要,很多情况是仅仅测试一些方法,这些方法是简单特性的编码。在这种场景下,通过Manager手动触发每一个reload应用程序是不可行的或者是效率不够。
为了解决这类问题,Tomcat包含了一种叫做“backgroundProcess”的方法,作为Catalina组件的一部分。一般来说,这个过程提供session过期,但是如果正确配置,它也能监测所有的应用程序的类发生变化,假如有任何改变都会调用reload。
为了配置reloading,需要在应用程序的Context元素中添加“reloadable”属性,或者在Context片段或者在server.xml中。
<Context ... reloadable="true">
在Context元素中的container上,在backgroundProcess运行之前你可以配置以秒为单位的延迟,通过backgroundProcessorDelay属性配置,尽管这个值也能被Host和Engine继承。
利用WatchedResource参数进行热reload
当你定义一个Context是“reloadable”时,Catalina的默认行为是观察它的类,库和web.xml配置文件,如果发生变化则触发reload。有时候,你想在列表中增加其他文件,比如日志配置文件。在这些场景中,你能够使用Context中嵌套WatchedResource元素来指向附加的文件,这些文件Tomcat能够观察。使用如下的语法:
<Host>
<Context ... reloadable="true">
<WatchedResource>path/to/watched/resource</WatchedResource>
<WatchedResource>another/path/to/another/resource</WatchedResource>
</Context>
</Host>
需要注意的是一对WatchedResource标签只能包含一个文件。如果你想为所有的Contexts创建全局settings,你需要在Context.xml、server.xml文件或者Catalina的conf/Context.xml文件中配置这些setting。
利用eclipse IDE进行热reload
通过配置你的Context,当类发生变化时能自动reload,使用web工具平台集成Tomcat和eclipse(或其他的Java IDE),你能增加热reload功能到你的开发环境。
按照以下简单的配置步骤:
先将Tomcat集成到eclipse环境中,查相关资料实现。
根据前面介绍的配置步骤,在你的Tomcat服务器上允许热reload
配置eclipse的工作目录直接指向启动的Tomcat服务器的文件夹结构,这可能需要一些允许配置。
当服务器运行时直接编辑你的类,当你保存应用程序的时候观察Tomcat自动reload它们。
迁移到生产环境
热reloading在开发环境是非常有用的,但把应用程序迁移到生产环境,你需要确保禁止所有的自动reloading配置。下面有一些说明为什么这个很重要。
reload类是复杂的。如果新类创建后,旧类的引用被保留下来,旧类就不会被合理的回收,这就是大家熟知的内存泄露问题。这是任何Java平台都会碰到的常见的问题。
除了这种考虑外,Tomcat使用Servlet的init()方法来reload应用程序,需要整个应用程序都被初始化,随着程序复杂度的增加,多步骤过程开销会越来越高。
最后,自动reload失败会导致状态数据丢失,这在生产环境中是不可接受的。
由于以上原因,当把应用程序迁移到生产环境,最好的做法是禁止自动reloading,而是依靠Tomcat Manager或者管理工具如Tcat来管理应用程序。
参考资料:https://www.mulesoft.com/cn/tcat/tomcat-reload
使用Tomcat的Reload提高开发速度(翻译)的更多相关文章
- Eclipse有助于提高开发速度的快捷键
用Eclipse已经很长一段时间了,自己常用的几个快捷键也已经很熟,但还是有一些自己不经常在开发中使用,但非常使用的快捷键,记录下来,以后利用来提高开发效率. 1.ctrl + shift + r ...
- 前后端分离中,使用swagger2和WireMock提高开发速度
一.使用swagger2生成接口文档 依赖 <dependency> <groupId>io.springfox</groupId> <artifactId& ...
- 【Eclipse提高开发速度-插件篇】Eclipse插件安装慢得几个原因
1.改动"Available Softeware Site" ,降低关联,详细做法 Install New Software >> Available Softewar ...
- 【Eclipse提高开发速度-插件篇】安装多语言Propertys编辑工具
安装的的时候能够通过 Help>Eclipse Marketplace的 搜索方式安装 或者 Help>Install New Software Name:Propertys URL:ht ...
- asp.net MVC提高开发速度(创建项目模板)
- 【Eclipse提高开发速度-插件篇】安装VJET插件,JS等提示开发插件
1.安装Apache Batik CSS 一般安装VJET插件会出现 Cannot complete the install because one or more required items co ...
- 【Eclipse提高开发速度-插件篇】Checkstyle的使用
1.CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发者遵守某些编码规范的工具. CheckStyle提供了大部分功能都是对于代码规范的检查 CheckStyle检验 ...
- tomcat免重启随意更改java代码 提高开发效率
转载:http://developer.51cto.com/art/201012/241243.htm 做为了一个java开发人员,总是为因为要增加一个类,或是增加删除一个方法,甚至修改一个小处代码而 ...
- 30 个极大提高开发效率超级实用的 VSCode 插件
Visual Studio Code 的插件对于在提升编程效率和加快工作速度非常重要.这里有 30 个最受欢迎的 VSCode 插件,它们将使你成为更高效的搬砖摸鱼大师.这些插件主要适用于前端开发人员 ...
随机推荐
- 【004】【JVM——垃圾收集算法】
Java虚拟机学习总结文件夹 垃圾收集算法 垃圾收集算法的实现涉及大量的程序细节,并且各个平台的虚拟机操作内存的方法又各不同样,介绍几种垃圾收集算法的思想及其发展过程. 标记-清除算法 垃圾收集 ...
- git for c#,子文件的加入
private static void SubDirFile() { string wkDir = @"E:\DotNet2010\单位project\Git.Client\lib2Test ...
- AB串
题目: 给定n个A和2n个B.用这些字符拼成一个字符串.要求这个串的全部前缀和后缀B的个数始终不少于A. (一个字符串的前缀是仅仅从开头到某个位置为止的子串,后缀是仅仅从某个位置到结尾的子串). 输入 ...
- Android多线程研究(2)——定时器
先来看一段代码: public static void main(String[] args) { new Timer().schedule(new TimerTask() { @Override p ...
- NodeJS+Express+MongoDB
一.MongoDB MongoDB是开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序丰富:高伸缩性:MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言 ...
- 【博客目录】SqlServer篇
SqlServer系列篇 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlSer ...
- D02 TED Elon Mulsk The future we're building — and boring
摘要:精选TED. 每个音频不超过2分钟,学英语和吸收伟大思想两不误 音频: https://n1audio.hjfile.cn/st/de745862-d5f4-4ef4-9218-d79361ca ...
- 自学Zabbix3.7.2-事件Event-来源与分类
一.zabbix 事件从字面理解,就是发生了一个事情就算是一个事件.就在trigger的文章内,我们已经有用到事件,这个事件要讲概念真心不知道怎么说,就拿trigger事件来说,如果trigger从当 ...
- Spring Boot整合 JdbcTemplate
(1) 在pom.xml加入jdbcTemplate的依赖: (2) 编写DemoDao类,声明为:@Repository,引入JdbcTemplate (3) 编写DemoService类,引入De ...
- 为eclipse离线安装hibernate tools插件
工具/原料 eclipse luna jboss hibernate tools 方法/步骤 下载hibernate tools插件 在eclipse根目录下创建myplugins和l ...