`
leitelyaya
  • 浏览: 68089 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Tomcat服务器中Quartz重复执行两次原因浅析

    博客分类:
  • Java
阅读更多
且不论很是热火的解决方案, 就表面感觉而言, 一个程序会执行两次, 那么必需是调用了两次程序。但从我们的配置上看来只定义了一次:
<Host name="lanvideo.cn"  appBase="lanvideo"
     unpackWARs="true" autoDeploy="true"
     xmlValidation="false" xmlNamespaceAware="false">
     <Context path="" docBase="LanVideo" />
</Host>

目录结构:
$ ls lanvideo
LanVideo.war

但从实际的启动效果来看,情况却非如此:
$ bin/startup.sh
$ ls lanvideo
LanVideo.war
LanVideo
ROOT

实际解压出现LanVideo和ROOT两个目录, 并且目录里内容相同, 这就不难解释Quartz会执行两次的问题了。

问题发现了, 怎么解决呢?
先看看文档上的描述:
http://localhost:8080/docs/virtual-hosting-howto.html
这是采用了在conf/Catalina/lanvideo.cn下用ROOT.xml替代server.xml的Context的方式:
删除server.xml中Context的定义:
<Host name="lanvideo.cn"  appBase="lanvideo"
     unpackWARs="true" autoDeploy="true"
     xmlValidation="false" xmlNamespaceAware="false">
</Host>

新建conf/Catalina/lanvideo.cn/ROOT.xml
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="LanVideo">
</Context>

删除已经发布的LanVideo和ROOT文件夹后重启服务器。
$ ls lanvideo
LanVideo.war
LanVideo

貌似解决这个问题了。可是访问是却是404。
$ curl -i http://lanvideo.cn:8080
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 952
Date: Tue, 28 Dec 2010 08:59:57 GMT

看来官方的指南也解决不了问题。访问还是会依赖ROOT文件夹里的程序。

走到这一步说明说明正道不可走, 走偏门:
更改配置:
<Host name="lanvideo.cn"  appBase="lanvideo"
     unpackWARs="true" autoDeploy="true"
     xmlValidation="false" xmlNamespaceAware="false">
     <Context path="" docBase="LanVideo.war" />
</Host>

为什么是引向war?因为Context的unpackWAR属性会将docBase指向的war自动发布到path指定的地方。所以,利用这点,可以让它正常发布到ROOT文件夹下。

然后,在lanvideo下建立空的文件夹LanVideo,通过tomcat的发布检查,避开自动发布到LanVideo文件夹,只保留ROOT文件夹里的内容。
如此:
$ ls lanvideo
LanVideo.war
LanVideo
ROOT
$ ls lanvideo/LanVideo
$ ls lanvideo/ROOT
...
$ curl -I http://lanvideo.cn:8080
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=7B057642D076C8B9F33DA7A4401EE288; Path=/
Content-Type: text/html;charset=utf-8
Content-Length: 3915
Date: Tue, 28 Dec 2010 09:34:19 GMT

搞定!


附:
网上很多方案是说更改appBase, 我猜那些人也是这样找到的偏门吧, 不过妄称appBase设定错误, 我可不敢苟同。
分享到:
评论
1 楼 huguohuan 2011-09-24  
照着做,果然解决问题了,谢谢。

相关推荐

Global site tag (gtag.js) - Google Analytics