且不论很是热火的解决方案, 就表面感觉而言, 一个程序会执行两次, 那么必需是调用了两次程序。但从我们的配置上看来只定义了一次:
<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设定错误, 我可不敢苟同。
分享到:
相关推荐
通过对题目中提供的信息进行分析,我们可以了解到如何利用 Spring 与 Quartz 进行集成,从而实现 Tomcat 启动时调用 Quartz 执行一次任务的需求。通过合理配置 `SchedulerFactoryBean`、`CronTriggerBean` 和 `...
在“quartz 调用两次任务”这个问题中,我们可能遇到了一个常见问题,即同一个 Quartz 任务被错误地触发执行了两次。 在 Quartz 中,任务(Job)是通过实现 `org.quartz.Job` 接口的类来创建的,而调度则是通过 `...
当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果你的应用部署在多个服务器或容器上,没有正确地配置集群,可能导致每个实例都独立调度任务。 2. **配置错误**:Spring配置中...
在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...
1. **配置重复**:检查`spring-quartz.xml`中是否有多余的JobDetail和Trigger配置,可能导致同一个Job被触发两次。 2. **命名冲突**:如果Job的name和group没有唯一性,可能会出现多个相同Job实例。 3. **多实例...
在Java Web应用中,特别是在Tomcat这样的应用服务器中,Quartz能够帮助我们实现后台任务的自动化执行,比如定期数据备份、清理缓存等。这篇博客将探讨如何在Tomcat环境下配置和使用Quartz。 首先,我们需要理解...
问题的原因是,包含定时任务的项目部署在 webapps 目录下,Tomcat 中的两个独立的容器都部署了一遍,相当于项目在服务器上的 Tomcat 上部署了两次。两边同时会运行定时任务,指定的是同一个数据库。 解决方法 为了...
Tomcat自动加载是关键,因为我们需要确保Quartz能在Tomcat服务器启动时正确初始化,并且在运行过程中能够响应XML配置文件的变更。在Tomcat中,我们可以使用ContextListener来监听应用的上下文初始化和销毁事件。在上...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
我们要实现定时执行某个方法时,就可以在job目录中加入自己的方法类,但要实现GCJobInterface接口,重写execute 方法即可
在Spring框架中集成Quartz库可以实现强大的定时任务管理功能。Quartz是一个开源的作业调度框架,它允许程序创建和管理任务,以便在特定时间自动执行。Spring通过其优秀的依赖注入(DI)和AOP(面向切面编程)特性,...
Quartz.NET是一个强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度灵活的调度功能,使得开发者可以轻松地定义和控制任务的执行时间。在"Quartz.net作业调度自定义定时执行任务多任务执行...
文档中指出:“quartz两次执行问题是由于tomcat设置不当引起的,说白了,并非是quartz的原因,而是spring的配置被加载了两遍。”这意味着,尽管表面上看似乎是Quart-Z的问题,但实际上是由于Spring配置文件被重复...
在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务时,了解如何在Quartz中操作是至关重要的。 首先,让我们详细讲解...
总的来说,Quartz提供了一种强大的工具,用于在Java应用中实现定时任务的自动化执行,无论是在web应用服务器(如Tomcat)还是独立的应用中。通过理解并实践这个"Hello, World!"示例,你将能够更好地掌握Quartz的精髓...
Quartz 提供了多种 Trigger 类型,如 SimpleTrigger(一次性执行)和 CronTrigger(基于 cron 表达式执行)。在这个 demo 中,我们将关注 CronTrigger,因为它可以方便地实现按天、按周和按月的调度。 ```java ...
在实际项目中,有时我们需要判断一个Quartz任务是否正在运行,以便进行相应的操作,如避免重复执行或者进行状态监控。本文将详细介绍如何在Quartz中实现这一功能。 首先,理解Quartz的工作原理是关键。Quartz通过...
标题中的“spring2.0 Quartz 执行每天定时任务 普通普是执行任务”涉及到的是在Spring 2.0框架中使用Quartz库来创建并执行每天定时任务的场景。Quartz是一款强大的开源作业调度框架,它可以用来按计划执行各种任务,...
标题中的“spring定时器启动两次原因及解决”指的是在Spring框架中使用了定时任务功能,如Spring Boot的`@Scheduled`注解或者Spring Task模块,但遇到了定时任务被触发执行了两次的问题。这种情况可能是由于配置不当...
Quartz是一款广泛应用于Java环境下的开源任务调度框架,它提供了高度灵活的任务调度机制,使得开发者可以轻松地在应用程序中安排任务的执行。本教程将详细讲解如何使用Quartz实现一个简单的定时器功能。 首先,我们...