Quartz每次调度时被执行两次

[关键字:重复执行、重复调用、每次执行两次、执行2次]

前言:

先说一下,项目背景。由于组内某成员在用Maven搭建项目时不规范,导致项目的名称与实际访问项目名称不一致。
在部署项目时,必需要配一下虚拟路径,映射到那个项目所在目录下去,才能正常访问。
举个例子:项目名称叫student-web,部署到Tomcat-webapps下,本地环境正常情况下的访问url应该是:

127.0.0.1:8080/student-web

而实际访问的url需要这样:

127.0.0.1:8080/student

0x001: 初探

那首先想到问题的解决方案就是在Tomcat的server.xml内配置虚拟路径,来映射到实际项目。比如这样:

1 <Host .......>
2     <Context path="/student" docBase="D:\apache-tomcat\webapps\student-web"  reloadable="true"/>
3 </Host>

呐,一开始以为这样问题就解决了。后来发现,实则不是。这样做的后果是项目会被容器实例化两次。

0x002: why?

首先需要了解<Host>标签中的appBase属性和<Context>标签中的docBase属性的作用和区别是什么?
appBase属性:这个目录下面的子目录将自动被部署为web应用,且war文件将被自动解压缩并部署为web应用(默认为Tomcat下webapps目录)   注意这句话所说的每件(个)事(点)都可以被重新配置或取消。

docBase属性: docBase属性位于<Context>标签中,而<Context>标签的作用是用于指向不在webapps下的应用的所在目录,在tomcat启动时docBase属性指向的目录下的应用也被作为web项目同时启动。

在有了以上了解后,那Quartz每次调度时被执行两次方法的问题原因就找到了。

0x003: 解决方案

1.将<Host>标签内的<Context>标签去除,让Tomcat自动去扫描webapps下的应用并部署。
2.若 ‘必需使用<Context>标签’ 且 ‘必需配置虚拟路径映射’ (注意这句话,后边解释),则必需将项目移出webapps目录至某个新目录,同时将<Context>标签中的docBase属性指向该新移至的目录

(解释一下第2条的前半句,经过测试发现,将student-web项目放到webapps目录,且同时配置<Context>标签的path属性为“/项目名称”,
启动Tomcat,此时项目并不会跑两遍,还是一遍,因为path属性指定的值还是项目名称,等于没配置。如下:

1 <Host .......>
2     <Context path="/student-web" docBase="D:\apache-tomcat\webapps\student-web"  reloadable="true"/>
3 </Host>

若是配置<Context>标签的path属性值为 “/非项目名称” 且 docBase属性指向webapps目录,那项目肯定会被容器实例化两遍!如下:

1 <Host .......>
2     <Context path="/student" docBase="D:\apache-tomcat\webapps\student-web"  reloadable="true"/>
3 </Host>

至于选择哪种解决方案,根据实际情况定,那我这里只能选择第2种。)

0x004: 声明

导致Quartz调度任务被执行两次的原因有很多,以上列举的2种解决方案 可能 并 不适合你。亦可从其他方向查找原因。
比如,检查Quartz的xml配置文件被加载了2次等等。

0x005: 完结
分享是技术进步的源泉,作者能力有限,如有错误,欢迎指出,不吝赐教。

原文地址:https://www.cnblogs.com/zhifa/p/10932924.html

时间: 2024-10-07 04:17:35

Quartz每次调度时被执行两次的相关文章

quartz 应用到 spring定时任务 执行两次 ,问题解决方案

是Tomcat服务器的问题,修改conf目录下的server.xml.修改节点Host,将appBase属性由默认"webapps"设置为空("")即可,如下所示: <Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"  xmlValidation="false" xmlNam

jquery validate组件导致表单onsubmit事件执行两次

这是今天在工作中遇到的一个问题.由于业务需要在原来表单提交时增加一段新的校验逻辑. 原来的逻辑如下(代码都做了简化): 在表单提交时,使用check方法校验 <form onsubmit= "return check();"> 方法代码: function check(){ if(...){ alert("xxx"); return false; } } 因为新增了一段逻辑,所以我新增了一个方法,调整了代码的结构: < form onsubmit=

quartz执行两遍问题

转:http://blog.csdn.net/hejinwei_1987/article/details/49100975 在现在的项目中发现Quartz执行了两次,在网上找到下列解决方案,我是用的第一种,灰常感谢这位哥们,转自:http://my.oschina.net/EugeneQiu/blog/265040?p=1 很多人在使用spring的Quartz配置定时任务时,会发现每次定时时间到达后,指定的定时方法同时执行了两次. (P.S. 本人项目用的Jfinal搭建,同样出现该问题.)

分析解决 spring quartz 中出现的执行两次问题

1. 问题描述 在开发询盘功能时,遇到一个需求,就是后台定时任务执行用电施工业务的工单下发. 使用的技术是 spring quartz,因为其他应用有先例,配置quartz 完成后,先写了一个 helloworld 测试下. 然而却发现,每次到定时时间后,程序都会执行两次. 2. 分析过程 先使用 bing 搜索了下看别人是否也遇到过类似问题,果然有. http://blog.csdn.net/jiang117/article/details/43077275 上面文档的作者,查找的原因是 Co

spring quartz执行两次问题

解决quartz定时任务被触发两次的问题: 其中<Host/>告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,<Context/>又让tomcat再加载了一遍(一般情况下配置<Context/>,主要是由于想域名访问时将工程名去掉的原因配置),这种情况下会导致工程中的quartz定时被两次触发,执行两次. <Host/>里面的改成 autoDeploy="false" deployOnStartup="fa

Quartz定时调度jar包的执行Demo分享

1.Quartz简介 ? Quartz框架的核心是调度器.调度器负责管理Quartz应用运行时环境.调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件.Quartz不仅仅是线程和线程管理.为确保可伸缩性,Quartz采用了基于多线程的架构.启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业.这就是Quartz怎样能并发运行多个作业的原理.Quartz依赖一套松耦合的线程池管理部件来管理线程环境. 2.项目相关 ? 该定时器Demo用于定时执行制定路径下的jar

ajax跨域往php程序post数据时,php程序总是执行两次的解决方法

php程序是部署在IIS7上面,ajax提交数据时,遇到了两个问题,一个就是跨域,一个php程序总会被执行两次. 第一个问题的解决方法,是百度出来的,添加下面几行代码就可以了: header('Access-Control-Allow-Origin:*'); header("Access-Control-Allow-Headers: x-requested-with,content-type"); header('Access-Control-Allow-Methods: OPTION

Spring与Quartz使用说明 job不同步执行(第一个job完成后才开始第二个job)

转自:http://blog.sina.com.cn/s/blog_675e9aeb0100qghp.html 最 近因为项目后台需要使用一个线程去定时跑一些任务,所以看了一下Spring和Quartz的使用与集成.例如发短信.邮件.根据实际使用,此集成使用比 自己去写线程方便和灵活,可以不用代码实现复杂的计划任务,如“1月份的每周三.周五的早上9点至10点每5钟一次任务”.所以分享一下. Quartz官方网址:http://www.quartz-scheduler.org/ 集成方法 集成起来

java 多线程——quartz 定时调度的例子

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 配置 第2部分 代码示例 第1部分 配置 有关quartz的api文档地址:Quartz Enterprise Job Scheduler 1.8.6 API 主要接口目录: 重点看下Job,Scheduler,Trigger,JobDetai