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

且不论很是热火的解决方案, 就表面感觉而言, 一个程序会执行两次, 那么必需是调用了两次程序。但从我们的配置上看来只定义了一次:

<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会执行两次的问题了。

问题发现了, 怎么解决呢?
先看看文档上的描述:
[url]http://localhost:8080/docs/virtual-hosting-howto.html[/url]
这是采用了在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设定错误, 我可不敢苟同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值