`

springmvc结合quartz实现定时任务

阅读更多
一、问题背景

在我们实际开发项目的过程中,经常需要在某一个时刻自动触发一个任务定时提取一些业务数据或者报表。比如,客户希望在每天晚上的某个时点将业务数据提取到某一个表中,并且生成新的报表。基于这种情况,我们使用quartz来实现任务的自动运行

二、代码实现

任务监听类:TaskFilter.java


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.expression.ParseException;
import org.springframework.stereotype.Repository;

import com.ssm.job.domain.JobPlanDomain;

@Repository("taskFilter")
public class TaskFilter implements InitializingBean {

	// 0 0 12 * * ? 每天12点整触发一次
	// 0 15 10 ? * * 每天10点15分触发一次
	// 0 15 10 * * ? 每天10点15分触发一次
	// 0 15 10 * * ? * 每天10点15分触发一次
	// 0 15 10 * * ? 2005 2005年内每天10点15分触发一次
	// 0 * 14 * * ? 每天的2点整至2点59分,每分钟触发一次
	// 0 0/5 14 * * ? 每天的2点整至2点55分,每5分钟触发一次
	// 0 0/5 14,18 * * ? 每天的2点整至2点55分以及18点整至18点55分,每5分钟触发一次
	// 0 0-5 14 * * ? 每天的2点整至2点5分,每分钟触发一次
	// 0 10,44 14 ? 3 WED 每年3月的每个星期三的2点10分以及2点44分触发一次
	// 0 15 10 ? * MON-FRI 每月周一、周二、周三、周四、周五的10点15分触发一次
	// 0 15 10 15 * ? 每月15的10点15分触发一次
	// 0 15 10 L * ? 每月最后一天的10点15分触发一次
	// 0 15 10 ? * 6L 每月最后一个周五的10点15分触发一次
	// 0 15 10 ? * 6L 每月最后一个周五的10点15分触发一次
	// 0 15 10 ? * 6L 2002-2005 2002年至2005年间,每月最后一个周五的10点15分触发一次
	// 0 15 10 ? * 6#3 每月第三个周五的10点15触发一次
	// 0 0 12 1/5 * ? 每月1号开始,每5天的12点整触发一次
	//
	// 0 11 11 11 11 ? 每年11月11日11点11分触发一次
	/**
	 * 容器启动时初始化该类时,将任务都加到内存当中
	 * 
	 * @throws SchedulerException
	 * @throws ParseException
	 */
	public void initJobTrigger() throws SchedulerException, ParseException {

		SchedulerFactory schedulerFactory = new StdSchedulerFactory();
		Scheduler scheduler = schedulerFactory.getScheduler();
		// 这里可以读取数据库来设置各个任务
		List list = new ArrayList();
		JobPlanDomain t1 = new JobPlanDomain();
		t1.setCronExpression("* * * * * ?");
		t1.setValid("0");
		t1.setJobPlanCode("222222222222");
		list.add(t1);

		if (null != list && list.size() > 0) {
			Iterator ite = list.iterator();
			while (ite.hasNext()) {
				// 任务对象
				JobPlanDomain rj = (JobPlanDomain) ite.next();
				// 任务表达式
				String cronExpression = rj.getCronExpression();
				// 新建任务,任务组为默认的Scheduler.DEFAULT_GROUP,需要执行的任务类为TaskReport.class
				JobDetail jobDetail = new JobDetail("reportJob_" + rj.getJobPlanCode(), Scheduler.DEFAULT_GROUP, TaskReport.class);
				// 新建触发器,触发器为默认的Scheduler.DEFAULT_GROUP
				CronTrigger cronTrigger = new CronTrigger("trigger_" + rj.getJobPlanCode(), Scheduler.DEFAULT_GROUP);
				JobDataMap jobDataMap = new JobDataMap();
				jobDataMap.put("managecom", "8611");
				jobDataMap.put("wageno", "201409");
				jobDetail.setJobDataMap(jobDataMap);

				try {
					// 为触发器设置定时表达式
					cronTrigger.setCronExpression(cronExpression);
					String startTime = "2014-10-17 16:17:10";
					String endTime = "2014-10-17 16:17:50";
					SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					Date startDate = sdf.parse(startTime);
					Date endDate = sdf.parse(endTime);
					if(startTime.compareTo(endTime) > 0 ) {
						throw new Exception("起始时间比结束时间大!");
					}
					
					cronTrigger.setStartTime(startDate);
					cronTrigger.setEndTime(endDate);
					// 启动新增定时器任务
					scheduler.scheduleJob(jobDetail, cronTrigger);
					
				} catch (Exception e) {
					// 启动验证失败,设置任务标记为禁用
					e.printStackTrace();
					rj.setValid("1");
					// baseDao.updateObject(rj);
				}
			}
		}
		// 初始化任务只需要执行一次,执行一次后移除初始化触发器
		scheduler.unscheduleJob("InitTrigger", Scheduler.DEFAULT_GROUP);
		// 任务启动
		scheduler.start();
	}

	
	public static void main(String[] args) {
		TaskFilter t = new TaskFilter();
		try {
			t.initJobTrigger();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}



	@Override
	public void afterPropertiesSet() throws Exception {
		try {
			this.initJobTrigger();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}



任务计划类:JobPlanDomain.java

public class JobPlanDomain {

	//任务编号
	private String jobCode;
	//任务计划编号
	private String jobPlanCode;
	//任务启动时间表达式
	private String cronExpression;
	//任务启动状态 0 未启动 1 启动
	private String runState;
	//任务是否有效 0 有效 1 无效
	private String valid;
	//任务参数
	private String paramMap;
	//任务执行次数
	private int count;
	//下次任务启动时间,适用于任务启动多次
	private String nextRunTime;
	//任务开始时间
	private String startDateTime;
	//任务结束时间
	private String endDateTime;
	//执行频率,1、每天一次 2、每年一次 3、每小时一次  4、每周一次  
	private int frequence;
	//任务运行的节点和端口号
	private String ip;
	//任务定制人
	private String operator;
	//任务定制日期
	private String makeDate;
	//任务定制时间
	private String makeTime;
	//任务修改日期
	private String modifyDate;
	//任务修改时间
	private String modifyTime;
	
	public String getJobCode() {
		return jobCode;
	}
	public void setJobCode(String jobCode) {
		this.jobCode = jobCode;
	}
	public String getJobPlanCode() {
		return jobPlanCode;
	}
	public void setJobPlanCode(String jobPlanCode) {
		this.jobPlanCode = jobPlanCode;
	}
	public String getCronExpression() {
		return cronExpression;
	}
	public void setCronExpression(String cronExpression) {
		this.cronExpression = cronExpression;
	}
	public String getValid() {
		return valid;
	}
	public void setValid(String valid) {
		this.valid = valid;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public String getStartDateTime() {
		return startDateTime;
	}
	public void setStartDateTime(String startDateTime) {
		this.startDateTime = startDateTime;
	}
	public String getEndDateTime() {
		return endDateTime;
	}
	public void setEndDateTime(String endDateTime) {
		this.endDateTime = endDateTime;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public String getOperator() {
		return operator;
	}
	public void setOperator(String operator) {
		this.operator = operator;
	}
	public String getMakeDate() {
		return makeDate;
	}
	public void setMakeDate(String makeDate) {
		this.makeDate = makeDate;
	}
	public String getMakeTime() {
		return makeTime;
	}
	public void setMakeTime(String makeTime) {
		this.makeTime = makeTime;
	}
	public String getModifyDate() {
		return modifyDate;
	}
	public void setModifyDate(String modifyDate) {
		this.modifyDate = modifyDate;
	}
	public String getModifyTime() {
		return modifyTime;
	}
	public void setModifyTime(String modifyTime) {
		this.modifyTime = modifyTime;
	}
	public String getNextRunTime() {
		return nextRunTime;
	}
	public void setNextRunTime(String nextRunTime) {
		this.nextRunTime = nextRunTime;
	}
	public void setParamMap(String paramMap) {
		this.paramMap = paramMap;
	}
	public String getRunState() {
		return runState;
	}
	public void setRunState(String runState) {
		this.runState = runState;
	}
	public int getFrequence() {
		return frequence;
	}
	public void setFrequence(int frequence) {
		this.frequence = frequence;
	}
	public String getParamMap() {
		return paramMap;
	}
	
}




任务实现类:TaskReport.java

import java.util.Iterator;
import java.util.Set;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskReport implements Job {

	/**  
     * 报表生成任务  
     */ 
	@Override
    public void execute(JobExecutionContext je) throws JobExecutionException {   
		System.out.println(je.getJobDetail().getKey());
		System.out.println(je.getJobDetail().getJobClass());
		
		JobDetail jobDetail = je.getJobDetail();
		JobDataMap jobData = jobDetail.getJobDataMap();
		Set tjobSet =  jobData.keySet();
		Iterator tIterator = tjobSet.iterator();
		while(tIterator.hasNext()) {
			String key = (String)tIterator.next();
			System.out.println(jobData.get(key));
		}
    }  
}



三、将quartz.properties放到web工程classpath中

quartz.properties:
#============================================================================
# Configure Main Scheduler Properties  
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false


#============================================================================
# Configure ThreadPool  
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true


#============================================================================
# Configure JobStore  
#============================================================================
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.misfireThreshold = 60000
#org.quartz.jobStore.useProperties = false
#org.quartz.jobStore.tablePrefix = QRTZ_
#org.quartz.jobStore.dataSource = myDS


#org.quartz.jobStore.isClustered = true
#org.quartz.jobStore.clusterCheckinInterval = 15000


#============================================================================
# Configure DataSource
#============================================================================
#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/test
#org.quartz.dataSource.myDS.user = root
#org.quartz.dataSource.myDS.password = root
#org.quartz.dataSource.myDS.maxConnections = 10



四、运行类TaskFilter.java

运行前请修改TaskFilter.java中的时间。

控制台会依次打印出:

DEFAULT.reportJob_222222222222
class com.ssm.job.TaskReport
201409
8611
分享到:
评论

相关推荐

    spring+springMVC+mybatis+quartz动态定时任务创建

    在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...

    springmvc中实现quartz定时任务

    在Spring MVC中实现Quartz定时任务的步骤如下: 1. **引入依赖**:首先,你需要在项目中引入Quartz相关的jar包,如`quartz.jar`。如果使用Maven或Gradle,可以在pom.xml或build.gradle中添加对应的依赖项。 2. **...

    springmvc基本配置及定时任务配置修改

    动态修改定时任务是 Quartz 的一个重要特性,这可以通过以下方式实现: 1. **更新 Trigger**:如果你想要改变一个已存在的 Trigger,可以调用 `TriggerBuilder` 的相应方法,然后使用 `scheduler.rescheduleJob()` ...

    springMVC+quartz任务调度

    总结来说,SpringMVC 与 Quartz 的结合提供了一种强大的解决方案,可以轻松地在 Web 应用程序中实现复杂的定时任务管理。这种结合充分利用了 Spring 的优点,如依赖注入和面向切面编程,同时也利用了 Quartz 的强大...

    spring+quartz实现定时任务动态管理

    本项目旨在实现对Quartz定时任务的动态管理,包括添加、停止和恢复等操作。前端采用jQuery和Bootstrap构建,提供用户友好的可视化界面,同时应用了MyBatis分页插件来优化数据查询性能。 首先,让我们详细了解一下...

    SpringMVC利用Quartz实现可配置的定时器

    通过以上步骤,我们可以在SpringMVC项目中利用Quartz实现可配置的定时任务。这种方式的好处在于任务和触发器的定义都集中管理,易于维护和扩展。同时,由于Spring的依赖注入特性,我们可以方便地在Job中注入其他服务...

    ssm集成quartz完成定时任务

    SSM(Spring、SpringMVC、MyBatis)框架与Quartz的集成是Java开发中常见的一种实现定时任务的方法。Quartz是一个强大的开源作业调度框架,可以用来执行定时任务,而SSM作为主流的Java Web开发框架,为业务逻辑处理...

    Mybatis+Spring+SpringMVC+quartz多数据源切换

    在Quartz定时任务的帮助下,可以通过定期执行脚本或程序逻辑,将数据从主库同步到从库,或者在多个平等的数据库之间进行数据交换。 在实际操作中,`syndataInfo`可能是一个包含数据库同步信息的文件,例如源数据库...

    Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查

    Spring框架结合Quartz库,提供了一种强大而灵活的方式来管理这些定时任务。本项目旨在演示如何利用Spring和Quartz从数据库中动态加载定时任务,并实现对它们的增删改查功能。以下是关于这个主题的详细知识讲解。 ...

    spring+quartz实现动态设置定时任务

    Spring和Quartz是两个强大的工具,可以协同工作来实现动态管理的定时任务。本文将深入探讨如何利用Spring框架和Quartz库创建和管理这些任务。 **Spring框架** 是一个广泛应用的Java企业级开发框架,它提供了丰富的...

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合Quartz 2.2.3是Java开发者在实现定时任务时常用的一种技术组合。Quartz是一款开源的作业调度框架,它允许程序在特定时间执行预定的任务,而Spring则是一个强大的企业级应用开发框架,提供了丰富的依赖注入...

    Maven+SpringMVC+SpringTask定时任务

    【标题】"Maven+SpringMVC+SpringTask定时任务"是将三个强大的Java技术框架集成,用于构建具有定时执行功能的Web应用。Maven是一个项目管理工具,它帮助管理和构建Java项目,通过依赖管理和项目信息管理使得开发更加...

    spring mvc quartz 动态设置时间

    当结合使用时,它们可以实现高度定制化的定时任务管理。 在给定的配置文件`applicationContext-quartz.xml`中,可以看到Spring如何配置Quartz来动态管理任务调度。以下是一些关键点: 1. **Bean配置**: - `...

    定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)

    本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...

    WEB管理的Quartz定时任务

    在Web管理的Quartz定时任务中,我们通常会结合SpringMVC和MyBatis来构建一个完善的后台管理系统,以便于管理和监控定时任务。下面将详细介绍这个系统的组成部分和实现方式。 **1. Quartz简介** Quartz是Java平台上...

    spring3.0+quartz-1.6.0定时

    总结起来,"spring3.0+quartz-1.6.0定时"的实现涉及到Spring框架的定时任务支持和Quartz库的结合使用,通过Spring的配置管理Quartz调度器,定义任务和触发器,最后编写具体任务逻辑的Java类。这种组合在实际项目中...

    spring quartz 非配置动态定时

    本话题主要关注如何在Spring中结合Quartz实现非配置动态定时任务,这允许我们在运行时动态地添加、修改或删除定时任务,而无需修改配置文件。 首先,我们需要理解Spring对Quartz的支持。Spring通过`org.spring...

    定时器(quartz+spring)读取数据库配置

    本教程将深入探讨如何使用Quartz与Spring框架结合来创建一个能从数据库读取配置的定时任务。 Quartz是一个开源的作业调度框架,它提供了丰富的API和功能,可以用来安排和执行任务。Spring框架则是一个全面的企业级...

    sping+ springMVC+mybatis分页,定时任务

    开发者可以进一步研究项目的具体实现,包括Spring的配置文件(如applicationContext.xml)、SpringMVC的配置文件(如servlet-context.xml)、MyBatis的Mapper配置和SQL语句,以及定时任务的配置(如Spring Task的...

    spring+mvc+quartz.rar

    《Spring MVC + Quartz 整合实现定时任务管理》 在现代企业级应用中,系统往往需要执行一些定时任务,如数据同步、报表生成等。Spring框架以其强大的功能和灵活的扩展性,成为Java开发的首选,而Quartz作为一款开源...

Global site tag (gtag.js) - Google Analytics