Quartz+Spring 自定义作业调度(作业在DB中配置)
为什么80%的码农都做不了架构师?>>>
Quartz版本为1.8.3
Spring版本为2.5
自定义作业表 QRTZ_JOB。
其中定义 作业标识、作业名称、类名、触发器名称、触发器脚本等。
下面看看在Spring中如何配置Quartz。
applicationContext.xml
< 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"
xmlns:context ="http://www.springframework.org/schema/context"
xsi:schemaLocation ="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init ="false" >
< context:component-scan base-package ="com.jn" />
< tx:advice id ="txAdvice" transaction-manager ="txManager" >
< tx:attributes >
< tx:method name ="insert*" propagation ="REQUIRED" />
< tx:method name ="del*" propagation ="REQUIRED" />
< tx:method name ="update*" propagation ="REQUIRED" />
< tx:method name ="*" read-only ="true" />
</ tx:attributes >
</ tx:advice >
< aop:config >
< aop:pointcut id ="allManagerMethod" expression ="execution(* com.jn.*.*(..))" />
< aop:advisor advice-ref ="txAdvice" pointcut-ref ="allManagerMethod" />
</ aop:config >
< bean id ="txManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name ="dataSource" ref ="proxoolDataSource" />
</ bean >
< bean id ="propertyConfigurer"
class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
< property name ="locations" >
< list >
< value > classpath:jdbc.properties </ value >
</ list >
</ property >
</ bean >
< bean id ="proxoolDataSource" class ="org.apache.commons.dbcp.BasicDataSource" destroy-method ="close" >
< property name ="driverClassName" value ="${driver}" />
< property name ="url" value ="${dburl}" />
< property name ="username" value ="${username}" />
< property name ="password" value ="${password}" />
</ bean >
< bean id ="sqlMapClient" class ="org.springframework.orm.ibatis.SqlMapClientFactoryBean" >
< property name ="dataSource" >
< ref local ="proxoolDataSource" />
</ property >
< property name ="configLocation" >
< value > classpath:sql-map-config.xml </ value >
</ property >
</ bean >
< bean name ="quartzScheduler" lazy-init ="true" class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name ="dataSource" ref ="proxoolDataSource" />
< property name ="applicationContextSchedulerContextKey" value ="applicationContextKey" />
< property name ="configLocation" value ="classpath:quartz.properties" />
</ bean >
</ beans >
Main.java
import com.jn.qrtz.job.JobManager;
import com.jn.spring.BeanFactory;
/**
* 启动类
* @author l
*/
public class Main {
/**
* 启动函数
* @param args
*/
public static void main(String[] args) {
try {
JobManager mgr = (JobManager)BeanFactory.factory().getBean("jobManager");
mgr.init();
mgr.dispatch();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
JobManager.java
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.jn.persistence.QrtzDaoImpl;
import com.jn.qrtz.JobConfig;
import com.jn.qrtz.service.SchedulerServiceImpl;
/**
* 作业管理类
*
* @author l
*/
@Component( " jobManager " )
@Scope( " singleton " )
public class JobManager {
private Logger log = Logger.getLogger(JobManager.class);
@Autowired(required = true)
private QrtzDaoImpl qrtzDao;
@Autowired(required = true)
private SchedulerServiceImpl schedulerService;
/** 作业列表 */
private List<JobConfig> allJobs = new ArrayList<JobConfig>();
/**
* 初始化作业列表
*/
public synchronized void init() {
try {
allJobs = qrtzDao.queryAllJobs();
log.info("作业初始化完成。");
}
catch (SQLException e) {
log.error("初始化作业失败。" + e.getMessage());
}
}
/**
* 系统启动时派发作业
*/
public void dispatch() {
for (JobConfig job : allJobs) {
try {
schedulerService.schedule(job);
}
catch (Exception e) {
e.printStackTrace();
log.error(job.toString() + "派发失败。" + e.getMessage());
}
}
}
public SchedulerServiceImpl getSchedulerService() {
return schedulerService;
}
public void setSchedulerService(
@Qualifier("schedulerService") SchedulerServiceImpl schedulerService) {
this.schedulerService = schedulerService;
}
public QrtzDaoImpl getQrtzDao() {
return qrtzDao;
}
public void setQrtzDao(@Qualifier("qrtzDao") QrtzDaoImpl qrtzDao) {
this.qrtzDao = qrtzDao;
}
}
其中QrtzDaoImpl对象是用于从QRTZ_JOB表中取得作业列表,并将作业封装为JobConfig对象。
SchedulerServiceImpl对象用于派发Job。
SchedulerServiceImpl.java
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.jn.qrtz.JobConfig;
import com.jn.qrtz.job.WorkDispatcher;
/**
* 作业派发、移除类
* @author l
*/
@Component( " schedulerService " )
public class SchedulerServiceImpl {
@Autowired
private Scheduler scheduler;
/**
* 移除作业
* @param config
* @return
* @throws SchedulerException
*/
public boolean remove(JobConfig config) throws SchedulerException {
if(config == null) {
return false;
}
return removeJob(config.getJobName(), config.getJobGroup());
}
/**
* 派发作业
* @param config
* @throws Exception
*/
public void schedule(JobConfig config) throws Exception {
String triggerName = config.getTriggerName();
String triggerGroup = config.getTriggerGroup();
String cronStr = config.getTriggerScript();
String jobName = config.getJobName();
String jobGroup = config.getJobGroup();
JobDetail jobDetail = new JobDetail(jobName, jobGroup, WorkDispatcher.class);
jobDetail.getJobDataMap().put(JobConfig.EXEC_INFO, config.cloneInfo());
schedule(triggerName, triggerGroup, cronStr, jobDetail);
}
/**
* 派发作业
* @param name
* @param group
* @param cronStr
* @param jobDtl
* @throws Exception
*/
private void schedule(String name, String group, String cronStr, JobDetail jobDtl)
throws Exception {
CronTrigger cronTrigger = new CronTrigger(name, group, jobDtl.getName(), jobDtl.getGroup(),
cronStr);
scheduler.scheduleJob(jobDtl, cronTrigger);
}
/**
* 移除作业
* @param jobName
* @param group
* @return
* @throws SchedulerException
*/
private boolean removeJob(String jobName, String group) throws SchedulerException {
scheduler.pauseJob(jobName, group);
return scheduler.deleteJob(jobName, group);
}
@Autowired
public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler) {
this.scheduler = scheduler;
}
}
由这些代码,便可以通过Quartz框架去调度 我们定义在QRTZ_JOB表中的作业了。
由于Quartz框架本身依赖一些表,其中我们执行的作业,同样会被框架保存在那些它所依赖的表中,
如:qrtz_job_details表。
当Spring加载quartzScheduler时,Quartz框架会被自动启动并调度保存在qrtz_job_details表中的作业。
所以再次启动时,应先将 Quartz依赖的表清空。
当然这个操作也可以被集成在代码中。
还有另外一种方案可实现此的功能,便是重写org.springframework.scheduling.quartz.SchedulerFactoryBean类,
自定义类继承此类,在自定义的类中注入自己的对象,在其中取得 作业列表,
并生成Trigger对象数组,调用 org.springframework.scheduling.quartz.SchedulerFactoryBean 类的setTriggers(Trigger[]) 方法。
设置好Trigger数据。
最后再 调用Scheduler的start()方法,Quartz便可调度这些作业了。
转载于:https://my.oschina.net/baobao/blog/17000
Quartz+Spring 自定义作业调度(作业在DB中配置)相关推荐
- spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明
背景: 在项目中遇到下面这个exception Exception occurred while logging on hibernate operation: Cannot open connect ...
- springboot 添加拦截器之后中文乱码_springboot中配置了拦截器后,拦截器无效的解决方案之一...
springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...
- Spring框架IOC基础及XML的配置 第二章
1 Spring概述 1.1 关于框架 框架的概念 框架:特指软件框架,它是我们在实际开发中解决项目需求的技术集合.运用框架可以大大简化代码的编写,缩短开发周期.同时,对后续负责项目维护的人员降低技术 ...
- 使用SPANN方式将Spring&Quartz与自定义注释集成
在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业. 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中. 批注定义了作业的名称,组及 ...
- Spring&Quartz集成自定义注释
我们知道Spring支持与Quartz框架集成. 但是到目前为止,Spring仅支持静态XML声明方法. 如果想了解如何将Spring与Quartz集成,可以参考Spring + Quartz + J ...
- 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
2019独角兽企业重金招聘Python工程师标准>>> spring使用了这么长时间, 你真的了解spring bean加载的机制吗? 这个是我们项目中最常见的配置文件中的内容配置, ...
- spring中配置quartz定时器
spring中配置quartz定时器 最近项目中用到定时器,项目用的spring所以想在spring中配置一下定时器,看到网上用quartz的比较多,所以就搜了一下.参考:http://blog.cs ...
- spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志
spring中自定义注解(annotation)与AOP中获取注解 一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. packag ...
- 5.概念(maven,ssm,springMvc,spring,自定义注解,二级缓存,范式,事务,mysql,线程池,map,hashmap,redis,饿汉,懒汉)
maven是啥: 1.Maven是一个项目管理和综合工具.Maven提供了开发人员构建一个完整的生命周期框架. 创建-导入jar报–编写配置文件-实现业务功能-测试-发布上线. 2.开发团队可以自动完 ...
最新文章
- 如何在python中创建列表副本,在Python中切片列表而不生成副本
- 表之顺序结构和链式结构
- GFS - The Google File System
- 无向图求割(找桥)tarjan
- 扩展Windows Mobile模拟器存储空间的方法
- g5420 win7集显驱动_台式机装WIN7?雷我已经趟完了
- ubuntu14.04系统下mips交叉编译环境搭建
- 【转帖】Java并发编程:volatile关键字解析
- java jbpm工作流_[JAVA] Jbpm工作流引擎原理及Jbpm复杂流程实现视频课程
- html文件做屏保win10,win10怎么自己添加动态屏保
- java 网站计数器_网站计数器——Java实现
- .net dll反编译出现的问题,以及部分修复的方法
- XML 转 JSON
- 未受信任的企业级开发者_“未受信任的企业级开发者”是什么意思?怎么解决?...
- Golang语言快速上手到综合实战视频教程
- uniapp获取当前页面路由及参数 _@jie
- DOSBOX的简单使用
- 一个大数据架构师应该掌握的技能
- C++语言单链表实现荷兰旗问题
- webview 上打开QQ客户端,QQ登入后自动打开添加QQ群的方法
热门文章
- 中国“两高”发布司法解释 依法严惩涉地下钱庄犯罪
- MOSS 2018 回顾:向 40 余个开源项目捐赠 97 万美元
- React系列--jsx语法及虚拟dom,渲染
- Ubuntu apt-get update 失败【转】
- HDU4706 Children's Day
- 关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明...
- LVS+Keepalived实现高可用群集
- [不得不提]国外的一个silverlight for cube的商业组件
- Nginx日志配置及分割
- 4周第4次课 压缩打包介绍 gzip bzip2 xz压缩工具