Spring整合Quartz调度器

Quartz是一个任务调度框架,由Java语言开发,可以用来做一些定时发送,监听事件等工作。 例如:让一个程序每天晚上12点执行一次。或者每隔5秒执行一次。

jar: org.quartz-scheduler包下

Quartz完成调度需要3步

JobDetail:告诉调度器要做什么。
Trigger:告诉调度器什么时候做。
Scheduler:准备妥了就从这里start

下面就是一个简单的spring 整合quartz的实例。

简单实现

先看JobDetail部分:写一个类实现Job接口,重写execute()方法,在该方法中写要执行的逻辑,(告诉调度器要做什么)

public class UpdateProductJob implements Job{

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            System.out.print("我来检查啦")
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

然后是配置xml文件。

<!--quartz-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.config.quartz.UpdateProductJob"></property>
    </bean>
<!--执行时间表达方式一-->
    <!--<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">-->
        <!--<property name="jobDetail" ref="jobDetail"></property>-->
        <!--<property name="startDelay" value="10000"></property>&lt;!&ndash;延迟10s&ndash;&gt;-->
        <!--<property name="repeatInterval" value="5000"></property>-->
    <!--</bean>-->
<!--执行时间表达方式二-->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0 59 23 ? * *" />
    </bean>

    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

从上面可以看到有两个Trigger分别是simpleTrigger和cronTrigger,这是两种表达执行时间的方式。

simpleTrigger是比较简单的方法,
<property name="repeatInterval" value="5000"></property>表示间隔5秒执行一次

而cronTrigger可以表达一些比较复杂的时间格式
<property name="cronExpression" value="0 59 23 ? * *" />表示每天23点59分执行一次
具体的语法请搜索cron表达式,有些网站提供了自动生成cron表达式的功能
比如http://cron.qqe2.com/ or http://www.cronmaker.com/

解决spring注入问题

在spring框架中会经常用到IOC,那么在上面的execute()方法中不避免的也会用到注入,但是对于新手来说会遇到注入的接口会是null。 解决这个问题有两个方法:

1.使用ApplicationContex对象加载applicationContext.xml文件注入UserDaoI接口,但是这个方法不好的一点是每当用一个接口就要写一个,比较麻烦。

ApplicationContext content = 
        new ClassPathXmlApplicationContext("classpath:META-INF/applicationContext.xml");
        userDaoI = content.getBean(UserDaoI.class);

2.第二个方法比较好,先写一个类继承AdaptableJobFactory 抽象方法,不需要任何改动

@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

2.2然后将这个类添加到配置文件里。

    <bean id="jobFactory" class="com.config.quartz.JobFactory"></bean>
        <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory" ref="jobFactory"></property>
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

最后完整的配置信息是:

<!--quartz-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="jobClass" value="com.config.quartz.UpdateProductJob"></property>
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="cronExpression" value="0 59 23 ? * *" />
    </bean>

    <bean id="jobFactory" class="com.config.quartz.JobFactory"></bean>
    
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory" ref="jobFactory"></property>
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

JobDetail部分就可以这样写了

@Service
public class UpdateProductJob implements Job{

    @Autowired
    ArticleService articleService;

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            articleService.updateArticleType();
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

Quartz轮训方式

Quartz轮训任务,需要配置一个参数,这个参数来控制Job任务是否并行,这个参数是concurrent。默认是true,如果concurrent设为true,到了指定的时间就如去执行,不管上一次有没有执行完。

<bean id="transmitTask"   
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject">  
        <ref bean="transTaskBusiness" />  
    </property>  
    <property name="targetMethod">  
        <value>execute</value>  
    </property>  
    <property name="concurrent">  
        <value>false</value>  
    </property>  
</bean>  

Quartz 2.3.0

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码农阿宇

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

这是在Asp.Net Core 2.1加入了一种新的Host,现在2.1版本的Asp.Net Core中,有了两种可用的Host。

1211
来自专栏移动开发面面观

Android并发备忘录

2303
来自专栏用户2442861的专栏

2015百度一道面试题引发的思考(shell脚本和网络)

原文    http://blog.csdn.net/chhuach2005/article/details/40044863

1173
来自专栏JetpropelledSnake

Python面试题之Python面试题汇总

(1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;...

4.8K4
来自专栏性能与架构

Redis案例 - 事件提醒

场景 任务是 当 redis set 中有新元素时及时处理 需要在set有新元素后自动得到通知,省得使用轮询的方式来查看是否有新元素 相当于对set做一...

3588
来自专栏一名合格java开发的自我修养

Quartz任务调度器

这里加入的是quartz-1.8.6版本。Quart的官网:http://www.quartz-scheduler.org/;项目中的框架的spring是spr...

1363
来自专栏Java工程师日常干货

Java定时任务调度详解前言JDK原生定时工具:TimerJDK对定时任务调度的线程池支持:ScheduledExecutorService定时任务大哥:QuartzSpring和Quartz的整合

在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员...

1072
来自专栏Seebug漏洞平台

D-Link DIR-605L 拒绝服务错误报告 (CVE-2017-9675)

原文:http://hypercrux.com/bug-report/2017/06/19/DIR605L-DoS-BugReport/ 译者:Serene ...

3796
来自专栏互扯程序

高手 都喜欢用vim编辑器

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

1284
来自专栏C++

python笔记:#002#第一个python程序

1194

扫码关注云+社区

领取腾讯云代金券