且不论很是热火的解决方案, 就表面感觉而言, 一个程序会执行两次, 那么必需是调用了两次程序。但从我们的配置上看来只定义了一次:
<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设定错误, 我可不敢苟同。
分享到:
相关推荐
tomcat启动时立即调用quartz执行一次
spring定时器代码。解决多次执行问题。包含quartz-all.jar包。 说明很详细。希望能帮上哪位朋友。
NULL 博文链接:https://zx527291227.iteye.com/blog/1680575
NULL 博文链接:https://medbricom.iteye.com/blog/1782765
NULL 博文链接:https://ch-dj.iteye.com/blog/2186072
quartz spring动态定时任务,可以直接在tomcat上面部署运行,框架是ssh2+ tomcat
我们要实现定时执行某个方法时,就可以在job目录中加入自己的方法类,但要实现GCJobInterface接口,重写execute 方法即可
spring注解Quartz定时执行功能
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
NULL 博文链接:https://stranger2008.iteye.com/blog/852258
Quartz.net作业调度自定义定时执行任务多任务执行c#,定时执行任务,如超时取消订单,自动确认收货等等
quartz实例 自动生成 表达式 动态更新 xml文件 tomcat自动加载 写的时候一点也不明白 确实费了点劲 写的不好 不要笑
java + quartz 实现定时任务的简单任务,下载即可运行
java定时执行多任务和quartz定时执行多任务
一台服务器挂了,另一台还能继续执行job,通过网上查找资料,都是java工程的方式,不好部署并测试,经过二天辛苦整合,终于整理成一个单spring web方式的工程,连接oracle数据库用tomcat即可完美运行.希望能帮到大家...
使用Quartz调度任务,根据需要人为的终止某个任务,适用于很多常见的场景
使用Spring Quartz执行定时任务
quartz 动态定时任务 根据数据库数据配置动态定时任务
Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。 Quartz.Net中的概念:计划者...
Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了,很好用,分享给大家