1.使用xml配置方式

Maven依赖

    <properties>
<!-- spring版本号 -->
<spring.version>4.2.2.RELEASE</spring.version> <!-- Quartz的版本 -->
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.2</version>
</dependency>

application.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置Job类 -->
<bean id="myJob" class="cn.enjoyedu.quartz.xml.CronJob"></bean> <!-- 配置JobDetail -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 执行目标job -->
<property name="targetObject" ref="myJob"></property> <!-- 要执行的方法 -->
<property name="targetMethod" value="execute"></property>
</bean> <!-- 配置tirgger触发器 -->
<bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!-- jobDetail -->
<property name="jobDetail" ref="jobDetail"></property> <!-- cron表达式,执行时间 每5秒执行一次 -->
<property name="cronExpression" value="0/5 * * * * ?"></property>
</bean> <!-- 配置调度工厂 -->
<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerFactoryBean"></ref>
</list>
</property> </bean> <!--<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">-->
<!--&lt;!&ndash;配置具体要执行的jobDetail&ndash;&gt;-->
<!--<property name="jobDetail" ref="simpleJobDetail" />-->
<!--&lt;!&ndash;初始延迟时间 1s&ndash;&gt;-->
<!--<property name="startDelay" value="1000" />-->
<!--&lt;!&ndash;间隔执行时间每2s执行一次&ndash;&gt;-->
<!--<property name="repeatInterval" value="2000" />-->
<!--</bean>-->
</beans>

Job类

package cn.enjoyedu.quartz.xml;

public class CronJob {
public void execute(){
System.out.println("定时任务执行...每5秒执行一次");
}
}

测试类

package cn.enjoyedu.quartz.xml;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringQuartzXmlTest {
public static void main(String[] args) {
//启动spring容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
System.out.println("initContext successfully");
}
}

执行结果

initContext successfully
定时任务执行...每5秒执行一次
定时任务执行...每5秒执行一次

2.注解方式

application.xml

    <!-- 开启组件扫描 -->
<context:component-scan base-package="cn.enjoyedu.quartz.annotation"></context:component-scan>
<!-- 开启定时任务,spring的定时任务。不是原生quartz -->
<task:annotation-driven/>

Job class

package cn.enjoyedu.quartz.annotation;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; @Component
public class AnnotationJob {
@Scheduled(cron = "0/5 * * * * ?")
public void excute(){
System.out.println("AnnotationJob 执行 5秒1次");
}
}

执行结果

initContext successfully
AnnotationJob 执行 5秒1次
AnnotationJob 执行 5秒1次

3.支持数据库配置cron表达式

3.1TimetaskController

@RequestMapping(value = "/initJob", method = RequestMethod.POST)
@ResponseBody
public String initJob() {
try {
ObjectResult result = timetaskBiz.initJob();
return JSONHelper.toJsonDataAPI(result, result.getApiStatus(), result.getErrorMsg());
} catch (Exception e) {
return JSONHelper.toJsonErrorDataAPI(e);
}
}

3.2 初始化job和启动job

    /**
* 初始化job
* @param timetask
*/
@Override
public ObjectResult initJob() {
ObjectResult result = new ObjectResult();
try {
Scheduler scheduler = factoryBean.getScheduler();
//这里从数据库中获取任务信息数据
Timetask timetask = new Timetask();
//0 表示定时任务停止中 1 表示定时任务执行中
timetask.setJobStatus("0");
//从数据库中查询定时印务记录。
List<Timetask> timetaskList = this.getTimetaskListCus(timetask).getListTimetask();
for (Timetask task : timetaskList) {
addJob(task);
}
} catch (SchedulerException e) {
e.printStackTrace();
result.setErrorMsg(e.getMessage());
result.setApiStatus(ApiData.STATUS_EXCEPTION);
}
return result;
} /**
* 添加job
* @param timetask
*/
private void addJob(Timetask timetask) {
if(timetask == null || (timetask.getJobStatus() == ScheduleJob.STATUS_RUNNING)) {
return;
} try {
Scheduler scheduler = factoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(timetask.getName(),timetask.getGroupName());
CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//如果不存在cronTrigger则重新创建一个
if(null == cronTrigger){
Class clazz = null;
try {
clazz = Class.forName(timetask.getBeanClass());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
JobDetail jobDetail = JobBuilder.newJob(clazz)
.withIdentity(timetask.getName(),timetask.getGroupName())
.usingJobData("data","")
.build();
jobDetail.getJobDataMap().put("scheduleJob",timetask);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(timetask.getCron());
cronTrigger = TriggerBuilder.newTrigger().withDescription(timetask.getIdStr())
.withIdentity(timetask.getName(),timetask.getGroupName())
.withSchedule(cronScheduleBuilder)
.build(); scheduler.scheduleJob(jobDetail,cronTrigger);
} else { CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(timetask.getCron());
//TODO usingJobData的参数
cronTrigger = cronTrigger.getTriggerBuilder().withIdentity(triggerKey).usingJobData("data","")
.withSchedule(cronScheduleBuilder).build();
scheduler.rescheduleJob(triggerKey,cronTrigger);
}
//执行
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}

3.3 job类

package com.zt.uni.api.task.jobs;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("MyJob ... execute ...");
}
} package com.zt.uni.api.task.jobs; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class MyJob2 implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("MyJob2 ... execute ...");
}
}

3.4 数据库配置

3.5 执行结果

MyJob ... execute ...
MyJob2 ... execute ...
MyJob ... execute ...
MyJob ... execute ...
MyJob2 ... execute ...
MyJob ... execute ...
MyJob ... execute ...

3.6 存在的问题(最近工作忙,后面再补回来)

  • 如果要支持定时任务可以拔插式使用
  • 要支持图形界面配置
  • 要支持定时任务在某个时间段期间执行[start_time ,end_time]执行
  • 要支持记录定时任务的异常信息

最新文章

  1. &quot;用户增长&quot;--快速身份认证实现用户增长的技术和产品方案
  2. 弹出框优化实例(alert和confirm)
  3. yum install mysql
  4. android测试(转)
  5. switch-case 执行顺序
  6. vagrant yii2 Exception &#39;yii\db\Exception&#39; with message &#39;SQLSTATE[HY000] [2002]
  7. AndroidStudio Gradle版本不匹配问题
  8. 新闻滚动marquee标签
  9. js之form表单的获取
  10. magento获取一些值的方法函数
  11. GNU/Linux与开源文化的那些人和事
  12. js数组拍平
  13. Jmeter4.0----安装教程(2)
  14. 20160226.CCPP体系详解(0036天)
  15. Vert.x 线程模型揭秘
  16. css3 样式过度器 Transition
  17. 大数据基础篇----jvm的知识点归纳-5个区和垃圾回收机制
  18. 异常处理,约束,MD5加密日志处理
  19. 微信小游戏 修改appid
  20. SUSE12的虚拟机安装以及ORACLE12C的安装

热门文章

  1. 9.Delegate类
  2. 最新解决VS2017+ Mysql + EF 创建实体数据模型 闪退的办法
  3. Java_枚举类
  4. SDUT 3373 数据结构实验之查找一:二叉排序树
  5. 把Spark SQL的metadata存储到mysql
  6. linux手动安装配置mysql5.6
  7. VMWare虚拟机无法打开内核设备&quot;\\.\Global\vmx86&quot;的解决方法
  8. 通过委托更新UI(异步加载)
  9. 初探webapi
  10. 哈雷监控设备的操作及升级NSG9k6G