资讯专栏INFORMATION COLUMN

Spring整合Quartz调度器

techstay / 2517人阅读

摘要:是一个任务调度框架,由语言开发,可以用来做一些定时发送,监听事件等工作。包下完成调度需要步告诉调度器要做什么。告诉调度器什么时候做。任务监听器两个接口分别是触发器相关的监听接口和作业相关监听接口。

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文件。


    
        
    

    
        
        
        
    

    
        
        
    

    
        
            
                
            
        
    

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

simpleTrigger是比较简单的方法,
表示间隔5秒执行一次

而cronTrigger可以表达一些比较复杂的时间格式
表示每天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然后将这个类添加到配置文件里。

    
        
        
        
            
                
            
        
    

最后完整的配置信息是:


    
        
    

    
        
        
    

    
    
    
        
        
            
                
            
        
    
    

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,到了指定的时间就如去执行,不管上一次有没有执行完。

  
      
          
      
      
        execute  
      
      
        false  
      
  
任务监听器

TriggerListeners and JobListeners 两个接口分别是触发器相关的监听接口和作业相关监听接口。
用来监听监听点之前,之中,之后需要处理的事情。
此外,也可以直接继承JobListenerSupport or TriggerListenerSupport

并且在配置文件添加以下内容来生效监听器:



    

除了可以配置全局的,也可以根据业务按个,按组配置监听器。

Quartz 2.3.0

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68319.html

相关文章

  • springboot整合quarzt实现动态定时任务

    摘要:而我这里定时任务的触发是要通过接口的方式来触发,所以只用实现以下的调度器即可。我这里简单说下任务的调度器,具体的任务类,触发器,任务什么时候执行是由它决定的。遇到的坑解决方式这个是因为不兼容的问题,所以使用是不会出现这个错误的。 实现定时任务的几种方式: 1.使用linux的crontab 优点: 1.使用方式很简单,只要在crontab中写好 2.随时可以修改,不需要...

    hoohack 评论0 收藏0
  • Springboot整合Quartz实现动态定时任务

    摘要:本文使用实现对定时任务的增删改查启用停用等功能。并把定时任务持久化到数据库以及支持集群。决定什么时候来执行任务。定义的是任务数据,而真正的执行逻辑是在中。封装定时任务接口添加一个暂停恢复删除修改暂停所有恢复所有 简介 Quartz是一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度。本文使用Springboot+Myba...

    IamDLY 评论0 收藏0

发表评论

0条评论

techstay

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<