Spring集成Quartz的3种方式
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">-->
<!--<!–配置具体要执行的jobDetail–>-->
<!--<property name="jobDetail" ref="simpleJobDetail" />-->
<!--<!–初始延迟时间 1s–>-->
<!--<property name="startDelay" value="1000" />-->
<!--<!–间隔执行时间每2s执行一次–>-->
<!--<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种方式的更多相关文章
- Spring 集成Hibernate的三种方式
首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 ...
- Spring Boot集成MyBatis的2种方式
目录 写在前面 准备工作 配置数据库驱动 配置数据源 原生集成MyBatis 依赖配置 注册MyBatis核心组件 定义并使用映射器 通过MyBatis-Spring-Boot-Starter集成 默 ...
- Spring创建JobDetail的两种方式
一.Spring创建JobDetail的两种方式 二.整合方式一示例步骤 1.将spring核心jar包.quartz.jar和Spring-context-support.jar导入类路径. 2.编 ...
- spring集成quartz
spring集成quartz 注意:出现异常"Caused by: java.lang.IncompatibleClassChangeError: class org.springframe ...
- 运行 Spring Boot 应用的 3 种方式
今天介绍 3 种运行 Spring Boot 应用的方式,看大家用过几种? 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 ...
- 事务管理(下) 配置spring事务管理的几种方式(声明式事务)
配置spring事务管理的几种方式(声明式事务) 概要: Spring对编程式事务的支持与EJB有很大的区别.不像EJB和Java事务API(Java Transaction API, JTA)耦合在 ...
- spring配置属性的两种方式
spring配置属性有两种方式,第一种方式通过context命名空间中的property-placeholder标签 <context:property-placeholder location ...
- Spring实现AOP的4种方式(转)
转自:http://blog.csdn.net/udbnny/article/details/5870076 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定 ...
- Spring事务配置的五种方式(转发)
Spring事务配置的五种方式(原博客地址是http://www.blogjava.net/robbie/archive/2009/04/05/264003.html)挺好的,收藏转发 前段时间对Sp ...
随机推荐
- Luogu 3530 [POI2012]FES-Festival
我是真的不会写差分约束啊呜呜呜…… BZOJ 2788被权限了. 首先对于第一个限制$x + 1 = y$,可以转化成$x + 1 \leq y \leq x + 1$, 所以连一条$(y, x, - ...
- NPOI操作之一EXCEL数据导入数据库
一.概要 前面讲到NPOI操作EXCEL导出功能,下面讲下从EXCEL里获取数据添加进数据库. 二.代码 HSSFWorkbook hssfworkbook; public void ExcelDat ...
- Bulma 源码解析之 .container 类
Bulma 的 .container 类是这样实现的. .container position: relative // 不设置桌面以下设备的 container +desktop margin: 0 ...
- Mysql--连接查询
内连接查询 意义:找到表和表之间的关系或者是桥梁.连接查询是查询两个或者两个以上的表时使用的. JOIN|CROSS JOIN| INNER JOIN 通过ON 连接条件(这三个方式都行)一般 ...
- 多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现
一.多线程模型一:生产者消费者模型 (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...
- [译]Javascript中的循环
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 树莓派(Raspberry Pi 3) centos7 扩容内存卡
在使用Win32DiskImager为一张空白的SD卡刷入新的centos7系统后,发现卡上的可用剩余空间并不大,用df -h查看,根目录下的空间使用率居然是25%,而且总空间也就2G左右.网上查到的 ...
- 简单配置webpack4 + vue
1.创建webpack4-vue文件夹 mkdir webpack4-vue && cd webpack4-vue 2.初始化npm npm init -y 3.安装相关依赖 npm ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...