Spring 4 + Quartz(任务调度框架)详解
简介
Quartz是一个完全由java编写的开源作业调度框架,它可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。
特点
- 可集群
- 可伸缩性
- 高可用性
- 负载均衡
整合示例
1. 使用maven配置示例所需依赖包
<properties> <springframework.version>4.0.6.RELEASE</springframework.version> <quartz.version>2.2.1</quartz.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${springframework.version}</version> </dependency> <!-- spring-tx包必须导入,因为Quartz需要依赖该包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${springframework.version}</version> </dependency> <!-- Quartz framework --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> </dependencies>
2. 配置任务调度执行类,这里有两种方式,第一种方式也是最简单的配置方式
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--指定任务执行的目标Bean--> <property name="targetObject" ref="oneBean" /> <!--指定任务执行类的目标方法--> <property name="targetMethod" value="outMessage" /> </bean>
第二种适合处理复杂的业务需求
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.os.china.ScheduledJob" /> <property name="jobDataMap"> <map> <entry key="towBean" value-ref="towBean" /> </map> </property> <property name="durability" value="true" /> </bean>
注:jobClass 一个继承自 QuartzJobBean 的自定义类,需要实现 executeInternal 方法。
jobDataMap 配置所有需要处理的任务类,本示例配置的是 TowBean。
编写自定义 ScheduledJob 类
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class ScheduledJob extends QuartzJobBean{ private TowBean towBean; @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { towBean.outMessage(); } public void setTowBean(TowBean towBean) { this.towBean = towBean; } }
3. 任务触发器配置,这里也有两种配置方式,第一种使用 SimpleTriggerFactoryBean 触发器
<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>
第二种使用 CronTriggerFactoryBean 触发器,使用该触发器可以配置出各种复杂的任务执行规则
<!--周日没隔5秒执行一次--> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="complexJobDetail" /> <property name="cronExpression" value="0/5 * * ? * SAT-SUN" /> </bean>
4. 配置 SchedulerFactoryBean,来管理和调度任务的执行
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="simpleJobDetail" /> <ref bean="complexJobDetail" /> </list> </property> <property name="triggers"> <list> <ref bean="simpleTrigger" /> <ref bean="cronTrigger" /> </list> </property> </bean>
5. 完整的 quartz-context.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.os.china" /> <!-- 最简单的JobDetail配置 --> <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--指定任务执行的目标Bean--> <property name="targetObject" ref="oneBean" /> <!--指定任务执行类的目标方法--> <property name="targetMethod" value="outMessage" /> </bean> <!-- 除了上面最简单的JobDetail配置外,还可以使用另外一种配置JobDetail的方式, 该配置方式可处理更加复杂的业务需求 --> <bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.os.china.ScheduledJob" /> <property name="jobDataMap"> <map> <entry key="towBean" value-ref="towBean" /> </map> </property> <property name="durability" value="true" /> </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> <!--周日没隔5秒执行一次--> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="complexJobDetail" /> <property name="cronExpression" value="0/5 * * ? * SAT-SUN" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="simpleJobDetail" /> <ref bean="complexJobDetail" /> </list> </property> <property name="triggers"> <list> <ref bean="simpleTrigger" /> <ref bean="cronTrigger" /> </list> </property> </bean> </beans>
6. 创建任务类OneBean
import org.springframework.stereotype.Component; /** * 第一个任务执行Bean * @author ZhangPengFei * @Discription * @Data 2017-2-25 * @Version 1.0.0 */ @Component public class OneBean { public void outMessage(){ System.out.println("hello 我是第一个任务执行类"); } }
7. 创建任务类TowBean
import org.springframework.stereotype.Component; /** * 第二个任务执行Bean * @author ZhangPengFei * @Discription * @Data 2017-2-25 * @Version 1.0.0 */ @Component public class TowBean { public void outMessage(){ System.out.println("hello 我是第二个任务执行类"); } }
8. 测试
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 测试类 * @author ZhangPengFei * @Discription * @Data 2017-2-25 * @Version 1.0.0 */ public class QuartzTest { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("quartz-context.xml"); } }
9. 执行结果
原文地址:https://my.oschina.net/feinik/blog/846426
相关推荐
-
实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) Java框架
2019-6-26
-
Mybatis的原始dao开发方法 Java框架
2019-5-5
-
实例讲解Springboot整合MongoDB进行CRUD操作的两种方式 Java框架
2020-6-11
-
spring配置多数据源——mybatis Java框架
2019-9-11
-
SpringBoot | 第二十一章:异步开发之异步调用 Java框架
2020-6-1
-
Spring的统一事务模型 Java框架
2019-3-4
-
SSM框架——使用MyBatis Generator自动创建代码 Java框架
2019-8-22
-
史上最清晰的红黑树讲解(上) Java框架
2019-3-30
-
ZooKeeper典型应用场景一览 Java框架
2019-1-25
-
【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换 Java框架
2020-6-8