论坛首页 Java企业应用论坛

在Tomcat中发布后执行两次Servlet的初始化

浏览 7037 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-05-05  
Web工程启动的时候,我要注册一个定时任务,每天的凌晨触发,所以使用了Quartz框架,其他没有任何外部包的依赖。
在Servlet的init方法里面启动这个schedule。 Job的run方法中每次执行的时候都会打info级别的日志处理。
然后在web.xml文件中注册这个Servlet,设置了load-on-startup的值为3
<servlet>  
   <servlet-name>AtmJobServlet</servlet-name>  
   <servlet-class>com.baoxian.atm.AtmJobServlet</servlet-class>  
   <strong><load-on-startup>3</load-on-startup></strong>  
  </servlet>

在IDE里面启动tomcat是没有问题的,但是将这个工程打包发布到服务器的tomcat目录下面去后再启动,每次执行Job的时候会打两次日志,执行两次run方法。

在tomcat/conf/server.xml中的配置是这样的:
<Host name="atm.baoxan.net"  appBase="dtcloud"  
     unpackWARs="true" autoDeploy="true"  
     xmlValidation="false" xmlNamespaceAware="false">  
     <Context path="" docBase="atm" />  
</Host> 


将工程打包后解压缩到了tomcat/dtcloud/atm目录下,tomcat/dtcloud/目录下还有一个ROOT目录,跟atm目录同级。
搜索了站内有篇文章:Tomcat服务器中Quartz重复执行两次原因浅析。 情况有点类似,不过是不行的。 我在想,tomcat的启动机制干嘛要弄这么麻烦,在Host的配置里面已经写得清清楚楚了,从哪个文件夹启动工程,为什么还非得加载两次呢  
   发表时间:2013-05-06  
去掉<Context path="" docBase="atm" />试试, 应该是tomcat加载了两次这个项目
0 请登录后投票
   发表时间:2013-05-06  
unpackWARs改成false试试看
0 请登录后投票
   发表时间:2013-05-06  
不用那样,想发布那个,context标签里面docBase和workDir目录直接写上其绝对路径就可以了。
0 请登录后投票
   发表时间:2013-05-06  
tomcat的加载顺序是
1)server.xml中<Host>/<Context>
2) conf/<engine name>/<host name>/context xml
3) webapps/war
4) webapps/文件夹

host下每个context的name唯一,加载序列中如果前面加载了相同名称的context,则不会在后面继续加载,你这个要么<Host>/<Context>中path配置与webapps里的文件夹同名,要么将这个文件夹放webapps外的其他地方,然后以绝对路径指过去
1 请登录后投票
   发表时间:2013-05-06  
gearever 写道
tomcat的加载顺序是
1)server.xml中<Host>/<Context>
2) conf/<engine name>/<host name>/context xml
3) webapps/war
4) webapps/文件夹

host下每个context的name唯一,加载序列中如果前面加载了相同名称的context,则不会在后面继续加载,你这个要么<Host>/<Context>中path配置与webapps里的文件夹同名,要么将这个文件夹放webapps外的其他地方,然后以绝对路径指过去


谢谢,改用绝对路径,成功了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics