- 浏览: 1030892 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (605)
- 数据挖掘 (22)
- spring (40)
- 工具使用 (39)
- java (137)
- JavaScript (40)
- webwork (12)
- web (120)
- 资源 (7)
- SSH (5)
- oracle (20)
- J2ME (1)
- 环境配置 (37)
- 项目管理 (29)
- mysql (14)
- struts (4)
- 项目总结 (27)
- ibatis学习 (33)
- 学习计划 (2)
- 缓存 (7)
- 重构 (3)
- Android (1)
- jquery (12)
- UML (3)
- 用户体验 (4)
- 习惯 (7)
- sakai (1)
- urlrewrite (4)
- rss (5)
- C plus plus (5)
- 算法 (5)
- 海量数据处理 (7)
- office(word、excel) (1)
- 面试题 (3)
- solr (8)
- 大数据 (2)
最新评论
-
hujin19861102:
截图看不见,最后一个webwrok的配置看不见
Ext+Webwork+Json 实现分页表格查询效果 -
蜗牛笔:
弱弱的问一句,要是分出来的词在词典中没有,那么两部分的pos- ...
ICTCLAS 中科院分词系统 -
weipeng1986:
授人予鱼不如授人予鱼,我想问你的是你是怎么总结的。比如第四种情 ...
JAVA中字符串连接效率的测试 -
xiaoqiang2008:
执行两次的原因是什么,好像楼主没弄清楚啊!是不是在web.xm ...
关于Spring中用quartz定时器在定时到达时同时执行两次的问题 -
Kent_Mu:
...
ibatis-dynamic的用法
我在使用spring的quartz配置定时任务时,发现每次定时时间到达后,指定的定时方法同时执行两次,而且此方法还是使用的synchronized关键字,每次定时一到,会发现此方法内的System.out输出信息输出两次,说明方法在这时执行了两次,解决方法没有找到更好的,不过有一个方法很有效,我设置了一个静态变量,只要此方法一执行,就将变量由0变为1,执行完再设置为0.如果运行方法前检查此静态变量不为0,则return.开发时注意此静态变量不要让别的方法使用.
下面是定时相关的代码:
package org.openjweb.core.schedule;
import org.apache.log4j.Logger;
import org.apache.lucene.demo.IndexHTML;
//import org.apache.lucene.demo.IndexHTML;
import org.openjweb.core.service.ServiceLocator;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class JobSchedule extends QuartzJobBean
{
static Logger logger = Logger.getLogger(JobSchedule.class);
static long counter = 0; //计数器
//static long priorTime = System.currentTimeMillis();
static int searchIndexFlag =0;//由doBuildIndex修改,其他方法不要修改此参数
public synchronized void doTimerSchedule()
{
counter++;
//System.out.println("测试定时器,总计数:"+String.valueOf(counter));
}
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
}
public synchronized void doBuildIndex()
{
//定时器同时调用两次的问题需要查找原因
if(searchIndexFlag>0)return ;//保证同一时刻只有一个定时器运行,通过这种方式保证每次定时时间到时,只执行一个线程
searchIndexFlag = 1;//锁定
System.out.println("开始构造索引库....");
String indexPath = ServiceLocator.getSysConfigService().getStringValueByParmName("luceneIndexDir");
String filePath = ServiceLocator.getSysConfigService().getStringValueByParmName("searchRoot");
System.out.println("索引路径为:"+indexPath);
System.out.println("搜索路径为:"+filePath);
IndexHTML.buildIndex(indexPath,filePath);
System.out.println("索引库构造完毕!");
searchIndexFlag = 0;//锁定解除
}
}
使用静态变量标志的方式解决了同一时刻调用两次方法的问题,但我想Spring应该有办法配置只能同一时刻运行一次,是什么造成的定时执行两次呢?大家有没有发现这种问题,欢迎赐教.下面是我在spring的配置:
<!-- Timer schedule -->
<bean id="defaultTimerBean" class="org.openjweb.core.schedule.JobSchedule"/>
<bean id="defaultTimerMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="defaultTimerBean" />
<property name="targetMethod" value="doTimerSchedule" />
<property name="concurrent" value="false" /> <!--将并发设置为false-->
</bean>
<bean id="defaultTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="defaultTimerMethod" />
<!--每三分钟的第一分钟触发-->
<property name="cronExpression" value="0 1/3 * * * ?" />
</bean>
<bean id="luceneTimerMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="defaultTimerBean" />
<property name="targetMethod" value="doBuildIndex" />
<property name="concurrent" value="false" /> <!--将并发设置为false-->
</bean>
<bean id="luceneTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="luceneTimerMethod" />
<property name="cronExpression" value="0 1/4 * * * ?" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="defaultTrigger"/>
<ref bean="luceneTrigger"/>
</list>
</property>
</bean>
http://blog.csdn.net/baozhengw/archive/2009/04/16/4083247.aspx
JonBLu 发表于2009年4月16日 19:06:49 IP:举报
用的是Tomcat吗?把项目从Tomcat下面的目录移出去试试放在tomcat的webapp下可能会出这种情况LostParadise 发表于2009年4月16日 20:26:07 IP:举报
对于Spring和Quartz来说,你的用法是两个job,所以他们根本不关心他们是否同时运行了。本来concurrent是用来控制同时运行两个相同的job的问题的,但是你的是两个job,所以也用不上。所以。。。。既然你有这样的需求,那只能你自己来解决了。zhenglinshuang 发表于2009年4月20日 18:34:50 IP:举报
如果是这样的话,可能说明两点:1.concurrent = false;具体来说对应的只是job的那个执行方法并发控制;(也就是说某个方法在执行完后才可再执行这个非并发方法)so,你这里用了一个job,两个执行方法,...2.jobDeatail调用bean job时,初始化了不同的的job .attend 发表于2009年5月20日 15:11:49 IP:举报
实现StatefulJob接口就可以了。 public class JobSchedule extends QuartzJobBean implements StatefulJobhjjwind 发表于2009年6月22日 9:27:44 IP:举报
我在开发中也遇到了定时器执行两次得情况……但代码移植到其他环境就正常只执行一次了,定时任务到时间点后连续执行两次应该与SPRING定时器本身的设置无关。
下面是定时相关的代码:
package org.openjweb.core.schedule;
import org.apache.log4j.Logger;
import org.apache.lucene.demo.IndexHTML;
//import org.apache.lucene.demo.IndexHTML;
import org.openjweb.core.service.ServiceLocator;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class JobSchedule extends QuartzJobBean
{
static Logger logger = Logger.getLogger(JobSchedule.class);
static long counter = 0; //计数器
//static long priorTime = System.currentTimeMillis();
static int searchIndexFlag =0;//由doBuildIndex修改,其他方法不要修改此参数
public synchronized void doTimerSchedule()
{
counter++;
//System.out.println("测试定时器,总计数:"+String.valueOf(counter));
}
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
}
public synchronized void doBuildIndex()
{
//定时器同时调用两次的问题需要查找原因
if(searchIndexFlag>0)return ;//保证同一时刻只有一个定时器运行,通过这种方式保证每次定时时间到时,只执行一个线程
searchIndexFlag = 1;//锁定
System.out.println("开始构造索引库....");
String indexPath = ServiceLocator.getSysConfigService().getStringValueByParmName("luceneIndexDir");
String filePath = ServiceLocator.getSysConfigService().getStringValueByParmName("searchRoot");
System.out.println("索引路径为:"+indexPath);
System.out.println("搜索路径为:"+filePath);
IndexHTML.buildIndex(indexPath,filePath);
System.out.println("索引库构造完毕!");
searchIndexFlag = 0;//锁定解除
}
}
使用静态变量标志的方式解决了同一时刻调用两次方法的问题,但我想Spring应该有办法配置只能同一时刻运行一次,是什么造成的定时执行两次呢?大家有没有发现这种问题,欢迎赐教.下面是我在spring的配置:
<!-- Timer schedule -->
<bean id="defaultTimerBean" class="org.openjweb.core.schedule.JobSchedule"/>
<bean id="defaultTimerMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="defaultTimerBean" />
<property name="targetMethod" value="doTimerSchedule" />
<property name="concurrent" value="false" /> <!--将并发设置为false-->
</bean>
<bean id="defaultTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="defaultTimerMethod" />
<!--每三分钟的第一分钟触发-->
<property name="cronExpression" value="0 1/3 * * * ?" />
</bean>
<bean id="luceneTimerMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="defaultTimerBean" />
<property name="targetMethod" value="doBuildIndex" />
<property name="concurrent" value="false" /> <!--将并发设置为false-->
</bean>
<bean id="luceneTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="luceneTimerMethod" />
<property name="cronExpression" value="0 1/4 * * * ?" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="defaultTrigger"/>
<ref bean="luceneTrigger"/>
</list>
</property>
</bean>
http://blog.csdn.net/baozhengw/archive/2009/04/16/4083247.aspx
JonBLu 发表于2009年4月16日 19:06:49 IP:举报
用的是Tomcat吗?把项目从Tomcat下面的目录移出去试试放在tomcat的webapp下可能会出这种情况LostParadise 发表于2009年4月16日 20:26:07 IP:举报
对于Spring和Quartz来说,你的用法是两个job,所以他们根本不关心他们是否同时运行了。本来concurrent是用来控制同时运行两个相同的job的问题的,但是你的是两个job,所以也用不上。所以。。。。既然你有这样的需求,那只能你自己来解决了。zhenglinshuang 发表于2009年4月20日 18:34:50 IP:举报
如果是这样的话,可能说明两点:1.concurrent = false;具体来说对应的只是job的那个执行方法并发控制;(也就是说某个方法在执行完后才可再执行这个非并发方法)so,你这里用了一个job,两个执行方法,...2.jobDeatail调用bean job时,初始化了不同的的job .attend 发表于2009年5月20日 15:11:49 IP:举报
实现StatefulJob接口就可以了。 public class JobSchedule extends QuartzJobBean implements StatefulJobhjjwind 发表于2009年6月22日 9:27:44 IP:举报
我在开发中也遇到了定时器执行两次得情况……但代码移植到其他环境就正常只执行一次了,定时任务到时间点后连续执行两次应该与SPRING定时器本身的设置无关。
评论
2 楼
xiaoqiang2008
2013-05-30
执行两次的原因是什么,好像楼主没弄清楚啊!
是不是在web.xml中同时配置了ContextLoaderListener和DispatcherServlet?假如真是这样的话,需要删掉一个配置,因为你相当于配置了两个spring容器,两个容器分别都执行各自的计划任务,所以同一个计划任务被执行了两次。
ContextLoaderListener是整合struts等其他框架时常用的配置,起加载时执行优先级高,可以在struts加载之前就执行;假如项目中只有spring框架,那仅配置DispatcherServlet就行了。
以上只是个人猜测,希望能有助于碰到类似问题的朋友们!
是不是在web.xml中同时配置了ContextLoaderListener和DispatcherServlet?假如真是这样的话,需要删掉一个配置,因为你相当于配置了两个spring容器,两个容器分别都执行各自的计划任务,所以同一个计划任务被执行了两次。
ContextLoaderListener是整合struts等其他框架时常用的配置,起加载时执行优先级高,可以在struts加载之前就执行;假如项目中只有spring框架,那仅配置DispatcherServlet就行了。
以上只是个人猜测,希望能有助于碰到类似问题的朋友们!
1 楼
wangqiuyi
2011-12-08
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="defaultTrigger"/>
<ref bean="luceneTrigger"/>
</list>
</property>
</bean>
给bean设置个id 应该就没问题了
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="defaultTrigger"/>
<ref bean="luceneTrigger"/>
</list>
</property>
</bean>
给bean设置个id 应该就没问题了
发表评论
-
spring 测试框架与维护项目结合问题
2011-11-02 02:18 1137之前项目中一直用 junit进行单元测试,使用的版本一直是ju ... -
数据日志记录讨论
2011-10-26 18:51 922详情见附件中的PPT -
spring+ibatis注解方式注入
2011-10-15 17:24 988http://www.cnblogs.com/archie20 ... -
spring 注解 简化log4j配置
2011-10-09 23:40 916http://macrochen.iteye.com/blog ... -
spring 2.5 TestContext 测试框架
2011-10-09 19:18 6270大多同事都已经养成用j ... -
spring2.5 引入资源文件的方式
2011-10-09 16:55 1052以前项目中引入 数据库 连接相关的字符串 都是使用 &l ... -
Spring 配置中的 default-lazy-init="false"
2011-09-26 18:03 1824Spring 配置中的 default-lazy-init=& ... -
webwork+spring+ibatis注解培训文档
2011-08-15 17:26 1361今天整理了 spring 注解的使用,主要是结合公司 ... -
spring包详解 (转)
2010-11-18 17:25 860spring.jar是包含有完 ... -
spring整合hessian进行远程通讯
2010-09-30 16:04 1914由于日志没有图片功能,可以访问内部论坛: host配置: 1 ... -
远程调用 - spring+rmi
2010-09-26 22:29 1196Spring提供类用于集成各种远程访问技术。这种对远程访问的支 ... -
事务处理spring
2010-03-24 22:33 980http://www.ibm.com/developerwor ... -
在并发情况下struts2与spring 组合需要注意的问题
2010-03-24 19:53 2074在并发情况下struts2与spring 组合需要注意的问题 ... -
Spring2.0框架的事务处理
2010-03-11 22:04 974http://www.iteye.com/topic/328 ... -
使用import简化spring的配置文件
2010-01-28 18:13 1106对于spring配置文件的编 ... -
Spring 中的数据源 转载
2010-01-25 18:17 1182http://www.blogjava.net/masen ... -
Spring事务配置的五种方式(转)
2010-01-25 17:32 803转载自: http://www.blogjava.net ... -
spring 2.5 事务属性
2010-01-25 15:59 1576spring事务的属性 转载自http://zhangli-l ... -
spring 2.5 事务管理
2010-01-25 15:57 2003spring2.5的事物管理,分为两种方式,一是基于注解方式的 ... -
事务传播属性(转)
2010-01-25 15:53 1156事务的传播行为和隔离级别[transaction behavi ...
相关推荐
spring定时器代码。解决多次执行问题。包含quartz-all.jar包。 说明很详细。希望能帮上哪位朋友。
Spring Quartz 定时器示例(Web工程版),欢迎下载。
Spring中的Quartz配置-Spring-定时器-java定时器.doc
定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)
Spring-quartz实现定时器(含代码)
Spring Quartz 定时器示例(Java工程版),欢迎下载。
spring注解Quartz定时执行功能
这里有spring的quartz定时器要用到的jar包,本人也有自己的小demo,如需要请联系本人
配置Spring+quartz定时器
Spring Quartz定时器 Spring Quartz定时器 Spring Quartz定时器 Spring Quartz定时器
spring boot集成quartz定时器,job支持spring的依赖注入
spring2.0+quartz1.6写的一个定时器,能运行的
quartz-all-1.6.0.jar commons-dbcp-1.2.1.jar commons-pool.jar 三个jar包,用于Spring Quartz定时器
idea 使用spring自带的定时器quartz 使用的c3p0 v0.95.2所包含的jar 亲测可用
quartz定时器api quartz定时器api quartz定时器api
NULL 博文链接:https://medbricom.iteye.com/blog/1782765
spring定时器Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。
Quartz定时器介绍与简单使用
一个完整的Spring-quartz定时器 实现的示例
spring和quartz的定时器的启动和停止例子