`
jayluns
  • 浏览: 143963 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring Quartz 调度与Jdk Timer

    博客分类:
  • J2EE
阅读更多
,最近经历的几个项目大多里面都使用到Spring Quartz,及JDKTimer 去实现任务调度的一些功能(比比如说,检查每天定时检查订单是否发送成功,或者每天具体的某个时间点根据当前的时间去更新一些状态值等等),在此贴点代码出来。
一 Quartz MethodInvokingJobDetailFactoryBean:
(使用MethodInvokingJobDetailFactoryBean的好处就是 你能够不用编写一个单独的TimerTask或QuartzJobBean类就可以调度单次方法调用)

1 代码简要如下就可以实现:UpdateAgentContractStatusJob.java

package com.kingdee.ais.ibmp.business.task;

import java.util.Date;

import org.apache.log4j.Logger;
import com.kingdee.ais.ibmp.business.advert.service.AdvAgentContractService;

/**
 *  task类,针对(MethodInvokingJobDetailFactoryBean這种bean)
 * @author yong_jiang
 *
 */

public class UpdateAgentContractStatusJob{
	
	
	private static Logger log = Logger.getLogger(UpdateAgentContractStatusJob.class);
	
	private AdvAgentContractService advAgentContractService;
	
	public AdvAgentContractService getAdvAgentContractService() {
		return advAgentContractService;
	}

	public void setAdvAgentContractService(
			AdvAgentContractService advAgentContractService) {
		this.advAgentContractService = advAgentContractService;
	}
	
	public void run(){
		
		long p1 = System.currentTimeMillis();
		log.info("updatestatus task start......"+new Date());
		
		/**
		 * 执行顺序 1 initOverriteDates(),2 updateforContractStaus(),3 updateforContractStaus;
		 */
			boolean res1=advAgentContractService.initOverriteDates();
			boolean res2=advAgentContractService.updateforContractStaus();
			boolean res3=advAgentContractService.updateforContractStaus2();
			System.out.println(res1);
			System.out.println(res2);
			System.out.println(res3);
			log.info("updatestatus task end...."+new Date());
			System.out.println("本轮调度时间:"+(System.currentTimeMillis() - p1));

		
		
	}

}


2 配置文件 sb-daemontask-context.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    
	<!-- 声明调度的Job-->
    <bean id="quartzJob" class="com.kingdee.ais.ibmp.business.task.UpdateAgentContractStatusJob">
  		<property name="advAgentContractService" ref="advAgentContractService" />
    </bean>
    
    <bean id="updateAgentContractStatusjobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="quartzJob"/>
        </property>
        <property name="targetMethod"><value>run</value> </property>
       
    </bean>
    
    <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="updateAgentContractStatusjobtask"/>
        </property>
        <!-- 在每天中午12点触发 -->
        <property name="cronExpression">
        	<value>0 27 10 * * ? *</value>
			</property>
    </bean>
    
    <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  -->
    <bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <!--可以加入多个调度 -->
            <list>
                <ref bean="doTime"/>
            </list>
        </property>
    </bean>
    
    
</beans>




二:JDK Timer任务调度, 使用jDK TIMER对象,你可以创建定制的timer或者调用某些方法的timer,包装的timer的工作由TimerFactoryBean完成
package com.gpdi.infores.rc.task;

import java.util.TimerTask;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.gpdi.infores.global.client.GlobalVars;

public class OnlineUserSynTask extends TimerTask {
	
	private static final Log LOG = LogFactory.getLog(OnlineUserSynTask.class);
	/**
	 * 定时任务是否开始工作,解决IDE拖Swing界面时自动把定时任务拉起来 而影响开发效率。
	 */
	private static boolean isStartWork = false;
	@Override
	public void run() {		
		if(!isStartWork) 
		{
			return;
		}
		LOG.debug("开始执行定时任务:OnlineUserSynTask");		 	
		try
		{
			//添加用户
			GlobalVars.getInstance().addUpdateOnlineUser();
			//检查版本
			ClientVerCheck.getInstance().checkVersion();
			//接收公告
			BulletinIncept.getInstance().incept();
		}catch(Exception ex)
		{
			LOG.error(ex.getMessage());
		};		
		LOG.debug("退出定时任务:OnlineUserSynTask");
	}
	public static void setStartWork(boolean isStartWork) {
		OnlineUserSynTask.isStartWork = isStartWork;
	}

}



 <bean id="onlineUserSynTask"class="com.gpdi.infores.rc.task.OnlineUserSynTask" />
    
	<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
	   <property name="timerTask" ref="onlineUserSynTask" />
	   每600000运行一次;
	   <property name="period">
	       <value>600000</value>
	   </property>
	   开启服务之后,延迟60000start
	   <property name="delay">
	       <value>60000</value>
	   </property>
	</bean>
	
	//最好使用TimerFactoryBean来设置任务
	<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
		   <list><ref bean="scheduleReportTask"/></list>		   
		</property>
	</bean>	



三 quartz与maven 集成:

<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
          <version>1.8.4</version>
	 </dependency>


	  <org.quartz-scheduler>1.8.4</org.quartz-scheduler>

           <dependency>
		<groupId>org.quartz-scheduler</groupId>
		<artifactId>quartz</artifactId>
		<version>${org.quartz-scheduler}</version>
	</dependency>


1
0
分享到:
评论

相关推荐

    spring timer、quartz俩种任务调度

    实现了spring配置比较流行的任务调度操作,java timer 和 quartz俩种方式 并且有注释描述。

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。...Quartz在功能上远远超越了JDK自带的Timer,很好很强大!

    Quartz_Job+Scheduling_Framework

    当初公司一个项目中有些定时候任务,原来是用 JDK 的 TaskTimer 来实现的,个人觉得比较笨拙--未能跳开节假日,也不能依 赖于其他的业务操作灵活安排计划。于是想起了 Spring 框架整合了一个作业调度框架 Quartz,...

    Spring+3.x企业应用开发实战光盘源码(全)

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:对...

    Spring.3.x企业应用开发实战(完整版).part2

    13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:...

    Spring 2.0 开发参考手册

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    Spring3.x企业应用开发实战(完整版) part1

    13.4.2 Spring对JDK Timer的支持 13.5 Spring对JDK 5.0 Executor的支持 13.5.1 了解JDK 5.0的Executor 13.5.2 Spring对Executor所提供的抽象 13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理...

    Quartz Job Scheduling Framework 中文版

    当初公司一个项目中有些定时候任务,原来是用 JDK 的 TaskTimer 来实现的,个人觉得比较笨拙--未能跳开节假日,也不能依赖于其他的业务操作灵活安排计划。于是想起了 Spring 框架整合了一个作业调度框架 Quartz,...

    Spring中文帮助文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    spring chm文档

    17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...

    Spring API

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

Global site tag (gtag.js) - Google Analytics