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]执行
  • 要支持记录定时任务的异常信息

Spring集成Quartz的3种方式的更多相关文章

  1. Spring 集成Hibernate的三种方式

    首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 ...

  2. Spring Boot集成MyBatis的2种方式

    目录 写在前面 准备工作 配置数据库驱动 配置数据源 原生集成MyBatis 依赖配置 注册MyBatis核心组件 定义并使用映射器 通过MyBatis-Spring-Boot-Starter集成 默 ...

  3. Spring创建JobDetail的两种方式

    一.Spring创建JobDetail的两种方式 二.整合方式一示例步骤 1.将spring核心jar包.quartz.jar和Spring-context-support.jar导入类路径. 2.编 ...

  4. spring集成quartz

    spring集成quartz 注意:出现异常"Caused by: java.lang.IncompatibleClassChangeError: class org.springframe ...

  5. 运行 Spring Boot 应用的 3 种方式

    今天介绍 3 种运行 Spring Boot 应用的方式,看大家用过几种? 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 ...

  6. 事务管理(下) 配置spring事务管理的几种方式(声明式事务)

    配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...

  7. spring配置属性的两种方式

    spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...

  8. Spring实现AOP的4种方式(转)

    转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...

  9. Spring事务配置的五种方式(转发)

    Spring事务配置的五种方式(原博客地址是http://www.blogjava.net/robbie/archive/2009/04/05/264003.html)挺好的,收藏转发 前段时间对Sp ...

随机推荐

  1. Help Bubu UVALive - 4490

    传送门 题目大意 有n本书,最多k次操作,每次操作可以把一本书拿出来,放到一个位置去,有一个指标较mess度,他是书的高度的段数,连续的书高度一样算一段,现在给你最先开始各个位置上的书的高度,求操作后 ...

  2. 国内物联网平台(1):百度物接入IoT Hub

    国内物联网平台(1) ——百度物接入IoT Hub 马智 物接入IoT Hub - 架构 全托管的云服务,帮助建立设备与云端之间安全可靠的双向连接 支撑海量设备的数据收集.监控.故障预测等各种物联网场 ...

  3. [raspberry pi3] opensuse使用splash中问题处理

    问题一: QXcbConnection: Could not connect to display :1594410864 解决方案: export QT_QPA_PLATFORM=offscreen

  4. 多用户ATM机(面向对象编程)

    let readline = require('readline-sync'); // 清屏函数 let clear = () => process.stdout.write(process.p ...

  5. sqlserver 时间差转换为天时分秒

    DECLARE @starttime DATETIME = '2016-12-01' , @endtime DATETIME = '2016-12-02 14:56:39.927'; DECLARE ...

  6. meta常用命令

    sessions -i 1用于查看你控制的电脑

  7. Glib学习笔记(二)

    你将学到什么 如何实现Object的构造函数和析构函数 如何在条件检测不允许的情况下终止对象创建 Object的构造函数 对象的构造函数是不允许失败,如果你需要一个允许失败的GObject构造函数,使 ...

  8. spark 熟悉过程

    spark shell 交互 启动:bin 目录下   ./spark-shell  --master local [ ×× ]    --jars ×××.jar   进入[ >> sc ...

  9. day04-Linux系统中用户控制及文件权限管理方法

    一. useradd指令新建一个用户包含以下文件 1. 用户信息文件:less   /etc/passwd                                                ...

  10. 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)

    传送门 我可能根本就没有学过斜率优化…… 我们设$dis[i]$表示第$i$棵树到山脚的距离,$sum[i]$表示$w$的前缀和,$tot$表示所有树运到山脚所需要的花费,$dp[i]$表示将第二个锯 ...