java spring-quartz定时器实现定时任务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allen202/article/details/53836658

Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便,下面我们看看如何使用它
一、核心概念
Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

1、Job

表示一个工作,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context)

2、JobDetail

JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

3、Trigger

代表一个调度参数的配置,什么时候去调。

4、Scheduler

代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

二、具体配置

下边是一个任务的配置文件,需要把这个文件加到Spring配置文件applicationContext.xml中,格式:
<import resource="classpath:queryexpirescaletask.xml"/>
queryexpirescaletask.xml配置文件内容
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">  
<beans>  
    <!-- 查询-->  
    <!-- 定时服务定义 -->  
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <!-- 自动启动 -->  
        <property name="autoStartup">  
            <value>true</value>  
        </property>  
        <property name="triggers">  
            <list>  
                <ref bean="cronTriggerBean" />  
            </list>  
        </property>  
    </bean>  

    <bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">  
        <property name="jobDetail">  
            <ref bean="jobDetailBean" />  
        </property>  
        <property name="cronExpression">  
            <!-- 凌晨1点开始-->  
            <value>0 0 1 * * ?</value>  
        </property>  
    </bean>  

    <bean id="jobDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <!-- 执行任务的类 -->
        <property name="targetObject" ref="queryFailScale"></property>       
        <!-- 执行任务的方法 -->
        <property name="targetMethod" value="run"></property>  
        <property name="concurrent" value="false" />  
    </bean>  
     <!-- 执行任务的类映射类,用户执行操作 -->
    <bean id="queryFailScale" class="org.duang.task.QueryFailScale"></bean>  
</beans>  
QueryFailScale类就是处理定时任务的操作
public class QueryFailScale{
    private Properties properties;
    //判断作业是否执行的旗标  
    private boolean isRunning = false;
    //定义任务执行体  
    public void run()    
    {  
        if (!isRunning)  
        {  
             LoggerUtils.info("-------定时任务开始", this.getClass());

        }  
    }
   }
}  

三、透过实例看原理

通过研读Quartz的源代码,和本实例,终于悟出了Quartz的工作原理。

1、scheduler是一个计划调度器容器(总部),容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。
2、JobDetail是一个可执行的工作,它本身可能是有状态的。
3、Trigger代表一个调度参数的配置,什么时候去调。
4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一对儿),就可以伴随容器启动而调度执行了。
5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。

四、总结

1、搞清楚了上Quartz容器执行作业的的原理和过程,以及作业形成的方式,作业注册到容器的方法。就认识明白了Quartz的核心原理。

2、Quartz虽然很庞大,但是一切都围绕这个核心转,为了配置强大时间调度策略,可以研究专门的CronTrigger。要想灵活配置作业和容器属性,可以通过Quartz的properties文件或者XML来实现。

3、要想调度更多的持久化、结构化作业,可以通过数据库读取作业,然后放到容器中执行。

4、所有的一切都围绕这个核心原理转,搞明白这个了,再去研究更高级用法就容易多了。

5、Quartz与Spring的整合也非常简单,Spring提供一组Bean来支持:MethodInvokingJobDetailFactoryBean、SimpleTriggerBean、SchedulerFactoryBean,看看里面需要注入什么属性即可明白了。Spring会在Spring容器启动时候,启动Quartz容器。

6、Quartz容器的关闭方式也很简单,如果是Spring整合,则有两种方法,一种是关闭Spring容器,一种是获取到SchedulerFactoryBean实例,然后调用一个shutdown就搞定了。如果是Quartz独立使用,则直接调用scheduler.shutdown(true);

7、Quartz的JobDetail、Trigger都可以在运行时重新设置,并且在下次调用时候起作用。这就为动态作业的实现提供了依据。你可以将调度时间策略存放到数据库,然后通过数据库数据来设定Trigger,这样就能产生动态的调度。

猜你喜欢

转载自blog.csdn.net/Allen202/article/details/53836658