- 浏览: 370286 次
- 性别:
- 来自: Alien
文章分类
最新评论
-
风一样的男人__:
[flash=200,200][url]引用[/url][/f ...
java线程内存模型,线程、工作内存、主内存 -
极乐君:
厉害了,,,请问可以转载到我们专栏吗?会注明来源和地址的~专栏 ...
java线程内存模型,线程、工作内存、主内存 -
zdd001:
Spring 线程池使用 -
zdd001:
Spring 线程池使用 -
u014663756:
看了三行就知道是我想要的!!
java线程内存模型,线程、工作内存、主内存
Quartz+Spring 自定义作业调度(作业在DB中配置)
Quartz版本为1.8.3
Spring版本为2.5
自定义作业表 QRTZ_JOB。
其中定义 作业标识、作业名称、类名、触发器名称、触发器脚本等。
下面看看在Spring中如何配置Quartz。
applicationContext.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"
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
package com.jn.common;
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
package com.jn.qrtz.job;
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
package com.jn.qrtz.service;
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便可调度这些作业了。
Quartz版本为1.8.3
Spring版本为2.5
自定义作业表 QRTZ_JOB。
其中定义 作业标识、作业名称、类名、触发器名称、触发器脚本等。
下面看看在Spring中如何配置Quartz。
applicationContext.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"
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
package com.jn.common;
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
package com.jn.qrtz.job;
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
package com.jn.qrtz.service;
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便可调度这些作业了。
发表评论
文章已被作者锁定,不允许评论。
-
Spring 线程池使用2
2013-04-25 18:41 1148<!-- 配置异步线程执行器 --> < ... -
struts2架构图
2013-01-20 23:04 2659请求首先通过Filter chai ... -
Hibernate缓存机制
2013-01-20 23:04 1031缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内 ... -
MQ 实战(转)
2012-12-01 00:27 16171.JMS介绍 JMS源于企业应用对于消息中间件的需求 ... -
stripes 和css 一些常用功能
2012-05-24 11:14 10301:表单 <stripes:form beanclas ... -
Tomcat源码下载
2012-03-30 12:11 1402由于现在项目相对比较 ... -
Maven+spring+ibatis+struts2.0+MQ+Memcached 项目构建
2012-02-28 11:27 40781>Maven一些基本命令: ... -
ActiveMQ+Spring2.5(转)
2012-02-14 17:59 1275ActiveMQ+Spring2.5 ActiveMQJMS ... -
基于Struts2、Freemarker的分页组件实现(附工程源码)
2012-01-10 10:56 2180基于Struts2、Freemarker的分页组件实现(附工程 ... -
Spring与memcached整合
2011-09-05 18:19 4980Spring与memcached整合 import org. ...
相关推荐
这种方式非常简单,开发者只需要在 Spring 配置文件中定义相应的 Bean,就可以使用 Quartz 实现任务调度。 以下是一个简单的示例代码: ```xml <bean id="overdueRecall" class="com.sursen.souba.ddlibserve....
### quartz在Spring中的配置 #### 一、简介与基本配置 Quartz 是一款开源的任务调度框架,被广泛应用于 Java 应用程序中进行任务的定时调度。它支持复杂的触发规则,能够实现高度灵活的任务调度机制。Spring 框架...
本文将深入探讨如何在Spring环境中集成Quartz以实现集群配置,以便于在分布式环境中进行高效的任务调度。 首先,理解Spring集成Quartz的核心在于Spring的Job接口和Quartz的Scheduler。Spring提供了`org.spring...
Quartz 则是一款强大的作业调度框架,它允许开发者在 Java 应用中实现定时任务的调度功能。通过将两者结合使用,可以更好地管理定时任务,并充分利用 Spring 的特性。 #### 二、Spring与Quartz的整合概述 整合 ...
标题中的“spring quartz集群配置”指的是在Spring框架中集成Quartz定时任务调度器,并实现其在集群环境下的配置。Quartz是一款开源的工作调度框架,它允许开发者创建、调度和执行计划任务。在Spring中整合Quartz,...
7、自定义任务参数:支持在线配置调度任务入参,即时生效; 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配...
集群解决方案中,除了Spring+Quartz的配置,还可以采用统一调度Server来协调各个应用server的任务执行。例如,通过IHS(IBM HTTP Server)或者其他负载均衡器,可以实现对应用server的流量控制,确保同一时间只有一...
本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...
实例是基于MyEclipse开发的。针对Quartz与Spring做集群的Demo...实例运行依赖Oracle数据库,根据quartz框架包docs/dbTables/目录下的sql脚本文件,创建表结构,修改工程中的Spring数据源配置。 Start.java启动程序。
在实际应用中,Quartz可以与Spring框架集成,通过Spring的依赖注入和配置管理来更方便地管理和调度作业。此外,Quartz支持多种触发器类型,如SimpleTrigger(简单触发器)、CronTrigger(CRON表达式触发器)等,可以...
SpringBatch 是一个由 Spring 社区开发的轻量级、全面的批处理框架,它为构建强大、可靠的批处理应用...在实际项目中,你还可以根据需求配置作业调度,如使用 Quartz 进行定时触发,或者根据业务逻辑动态调度作业执行。
文件`dbTables.zip`可能包含了Quartz在数据库中所需的表结构,运行这些SQL脚本能创建必要的表,用于存储Job和Trigger的信息。 集成Quartz到SpringBoot项目中,不仅可以实现基本的定时任务,还可以通过分布式特性在...
而Quartz则是一款强大且功能丰富的作业调度库,用于在Java应用中执行定时任务。本文将详细介绍如何将Spring与Quartz整合,实现高效、灵活的定时任务管理。 ### 1. Quartz简介 Quartz是OpenSymphony开源组织开发的...
在IT行业中,Spring框架是Java应用开发中的一个核心组件,而Quartz则是一个强大的任务调度库,常用于执行定时任务。本文将详细探讨如何在Spring框架中整合Quartz,以及在实际项目中如何利用它们来实现数据源切换,并...
2. **配置Quartz**:在`application.properties`或`application.yml`文件中,可以自定义Quartz的配置,例如数据库连接、线程池大小等。例如: ```properties # application.properties quartz.job-store-type=jdbc ...
Quartz 是一个开源的作业调度框架,用于 Java 应用程序中的轻量级、灵活的作业调度。它提供了强大的触发机制,允许开发者以各种方式安排任务的执行。然而,在集群环境下,Quartz 的部署和管理面临着一系列新的挑战,...
而Quartz则是一个强大的、开源的作业调度框架,用于在Java应用中安排任务执行。"springboot整合quartz"这个主题就是关于如何将Quartz与SpringBoot结合,以实现高效、自动化的任务调度。 在SpringBoot项目中整合...
SpringBoot集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用程序中定义和执行定时任务。Quartz是一个开源的作业调度框架,它提供了丰富的API来创建、调度和管理任务。SpringBoot,作为Spring框架的轻量...
Spring框架是JavaEE应用程序开发的流行选择之一,而Quartz是Java领域中最流行的作业调度器之一。将Spring和Quartz整合,可以实现高效、可靠的定时任务调度。然而,在集群、分布式系统中,实现Quartz集群变得非常...
Quartz 是一个强大的开源作业调度框架,常被用于构建企业级的应用程序,提供精确和可扩展的定时任务功能。在Spring Boot中集成Quartz,我们可以方便地创建和管理定时任务,使得应用程序能够按照预设的时间间隔执行...