但行好事
莫论前程❤

定时任务调度–Spring 4 + Quartz(任务调度框架)

简介

    Quartz是一个完全由java编写的开源作业调度框架,它可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。

特点

  1. 可集群
  2. 可伸缩性
  3. 高可用性
  4. 负载均衡

整合示例

  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>
  1. 配置任务调度执行类,这里有两种方式,第一种方式也是最简单的配置方式
<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;
    }
}
  1. 任务触发器配置,这里也有两种配置方式,第一种使用 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>
  1. 配置 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>
  1. 完整的 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>
  1. 创建任务类OneBean
import org.springframework.stereotype.Component;

/**
 * 第一个任务执行Bean
 * @author liupeng
 * @Discription
 * @Data 2019-5-16
 * @Version 1.0.0
 */
@Component
public class OneBean {
    public void outMessage(){
        System.out.println("hello 我是第一个任务执行类");
    }
}
  1. 创建任务类TowBean
import org.springframework.stereotype.Component;

/**
 * 第二个任务执行Bean
 * @author liupeng
 * @Discription
 * @Data 2019-5-15
 * @Version 1.0.0
 */
@Component
public class TowBean {
    public void outMessage(){
        System.out.println("hello 我是第二个任务执行类");
    }
}
  1. 测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 测试类
 * @author liupeng
 * @Discription
 * @Data 2019-5-15
 * @Version 1.0.0
 */
public class QuartzTest {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("quartz-context.xml");
    }
}
  1. 执行结果

img

赞(0) 打赏
未经允许不得转载:刘鹏博客 » 定时任务调度–Spring 4 + Quartz(任务调度框架)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏