`
leitelyaya
  • 浏览: 68887 次
  • 性别: 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  
照着做,果然解决问题了,谢谢。

相关推荐

    quartz 随tomcat启动执行一次

    通过对题目中提供的信息进行分析,我们可以了解到如何利用 Spring 与 Quartz 进行集成,从而实现 Tomcat 启动时调用 Quartz 执行一次任务的需求。通过合理配置 `SchedulerFactoryBean`、`CronTriggerBean` 和 `...

    quartz 调用两次任务

    在“quartz 调用两次任务”这个问题中,我们可能遇到了一个常见问题,即同一个 Quartz 任务被错误地触发执行了两次。 在 Quartz 中,任务(Job)是通过实现 `org.quartz.Job` 接口的类来创建的,而调度则是通过 `...

    spring java 定时器 执行两次 quartz

    当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果你的应用部署在多个服务器或容器上,没有正确地配置集群,可能导致每个实例都独立调度任务。 2. **配置错误**:Spring配置中...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...

    springMvc定时器执行两次

    1. **配置重复**:检查`spring-quartz.xml`中是否有多余的JobDetail和Trigger配置,可能导致同一个Job被触发两次。 2. **命名冲突**:如果Job的name和group没有唯一性,可能会出现多个相同Job实例。 3. **多实例...

    quartz在tomcat下配置使用

    在Java Web应用中,特别是在Tomcat这样的应用服务器中,Quartz能够帮助我们实现后台任务的自动化执行,比如定期数据备份、清理缓存等。这篇博客将探讨如何在Tomcat环境下配置和使用Quartz。 首先,我们需要理解...

    spring定时任务执行两次及tomcat部署缓慢问题的解决方法

    问题的原因是,包含定时任务的项目部署在 webapps 目录下,Tomcat 中的两个独立的容器都部署了一遍,相当于项目在服务器上的 Tomcat 上部署了两次。两边同时会运行定时任务,指定的是同一个数据库。 解决方法 为了...

    quartz实例 自动生成 表达式 动态更新 xml文件 tomcat自动加载

    Tomcat自动加载是关键,因为我们需要确保Quartz能在Tomcat服务器启动时正确初始化,并且在运行过程中能够响应XML配置文件的变更。在Tomcat中,我们可以使用ContextListener来监听应用的上下文初始化和销毁事件。在上...

    记一次Quartz重复调度(任务重复执行)的问题排查.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...

    quartz自动执行一定时

    我们要实现定时执行某个方法时,就可以在job目录中加入自己的方法类,但要实现GCJobInterface接口,重写execute 方法即可

    spring注解Quartz定时执行功能

    在Spring框架中集成Quartz库可以实现强大的定时任务管理功能。Quartz是一个开源的作业调度框架,它允许程序创建和管理任务,以便在特定时间自动执行。Spring通过其优秀的依赖注入(DI)和AOP(面向切面编程)特性,...

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    Quartz.NET是一个强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度灵活的调度功能,使得开发者可以轻松地定义和控制任务的执行时间。在"Quartz.net作业调度自定义定时执行任务多任务执行...

    quart-z 两次执行问题

    文档中指出:“quartz两次执行问题是由于tomcat设置不当引起的,说白了,并非是quartz的原因,而是spring的配置被加载了两遍。”这意味着,尽管表面上看似乎是Quart-Z的问题,但实际上是由于Spring配置文件被重复...

    Quartz调度、终止执行的任务

    在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务时,了解如何在Quartz中操作是至关重要的。 首先,让我们详细讲解...

    quartz的helloworld

    总的来说,Quartz提供了一种强大的工具,用于在Java应用中实现定时任务的自动化执行,无论是在web应用服务器(如Tomcat)还是独立的应用中。通过理解并实践这个"Hello, World!"示例,你将能够更好地掌握Quartz的精髓...

    quartz 实现按天、按周、按月定时任务的简单demo

    Quartz 提供了多种 Trigger 类型,如 SimpleTrigger(一次性执行)和 CronTrigger(基于 cron 表达式执行)。在这个 demo 中,我们将关注 CronTrigger,因为它可以方便地实现按天、按周和按月的调度。 ```java ...

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了

    在实际项目中,有时我们需要判断一个Quartz任务是否正在运行,以便进行相应的操作,如避免重复执行或者进行状态监控。本文将详细介绍如何在Quartz中实现这一功能。 首先,理解Quartz的工作原理是关键。Quartz通过...

    spring2.0 Quartz 执行每天定时任务 普通普是执行任务

    标题中的“spring2.0 Quartz 执行每天定时任务 普通普是执行任务”涉及到的是在Spring 2.0框架中使用Quartz库来创建并执行每天定时任务的场景。Quartz是一款强大的开源作业调度框架,它可以用来按计划执行各种任务,...

    spring定时器启动两次原因及解决

    标题中的“spring定时器启动两次原因及解决”指的是在Spring框架中使用了定时任务功能,如Spring Boot的`@Scheduled`注解或者Spring Task模块,但遇到了定时任务被触发执行了两次的问题。这种情况可能是由于配置不当...

    定时器quartz的使用方法

    Quartz是一款广泛应用于Java环境下的开源任务调度框架,它提供了高度灵活的任务调度机制,使得开发者可以轻松地在应用程序中安排任务的执行。本教程将详细讲解如何使用Quartz实现一个简单的定时器功能。 首先,我们...

Global site tag (gtag.js) - Google Analytics