定时任务框架Quartz

       在Spring Boot 中要实现定时任务,有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用Quartz。

1.Scheduled 这种用法非常简单,涉及到的业务非常简单是可以使用该用法。

2. Quartz

quartz的核心类有以下三个需要牢记:

调度器:Scheduler

触发器:Trigger

作业类:JobDetail

该图片用了 DistressRroke _chen的文章中的图片

详细见:https://blog.csdn.net/cms18374672699/article/details/87906910?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

文章中讲的也很清楚,这里就不做搬运工了。

 

 

贴了几张图片,其实关键的代码见下面这部分:

/**
 * 定时任务框架Quartz的基本组成部分:
 * 调度器:Scheduler
 * 任务:JobDetail
 * 触发器:Trigger,包括SimpleTrigger和CronTrigger
 *
 *                 Scheduler
 *                -        -
 *              -            -
 *            -                -
 *          -                    -
 *       JobDetail             Trigger
 *
 * 该部分代码主要完成两个事情: 在QuartzConfig 中配置 JobBean 和 Trigger
 *   1. 配置 JOb:
 *   两种方式:
 *   第一种方式使用 MethodInvokingJobDetailFactoryBean可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参
 *   第二种方式使用 JobDetailFactoryBean 构造出来的 JobBean ,任务类继承自 QuartzJobBean ,这种方式支持传参,将参数封装在JobDataMap中进行传递
 *   2. 配置触发器 Trigger
 *
 * @author Administrator
 * @Description:
 * @Auther: liangsh
 * @Date: 2020/5/28 17:47
 */

@Configuration
public class QuartzConfig {

    /**
     *
     * @return
     */
        @Bean
        MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        // 首字母小写,对应Myjob0这个类
        bean.setTargetBeanName("myJob0");
        // 对应Myjob0这个类里的hello()方法
        bean.setTargetMethod("hello");
        return bean;
    }

    @Bean
    SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
        SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
        //重复次数
        bean.setRepeatCount(5);
        //重复间隔2秒
        bean.setRepeatInterval(2000);
        bean.setStartTime(new Date());
        bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
        return bean;
    }

    /**
     * jobDetail
     * @return
     */
    @Bean
    JobDetailFactoryBean jobDetailFactoryBean1() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MyJob1.class);
        //可以不传递参数
//        JobDataMap data = new JobDataMap();
//        data.put("helloService", helloService());
//        bean.setJobDataMap(data);
        return bean;
    }

    /**
     *JobDetail绑定指定的Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例,
     * 再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。
     * @return
     */
    @Bean
    JobDetailFactoryBean jobDetailFactoryBean2() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MyJob2.class);
        JobDataMap data = new JobDataMap();
        // 使用JobDataMap 传递参数
        data.put("helloService", helloService());
        bean.setJobDataMap(data);
        return bean;
    }

    /**
     * CroTrigger是基于Cron表达式的,可以灵活设置定时器执行
     * @return
     */
    @Bean
    CronTriggerFactoryBean cronTriggerFactoryBean2() {
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        // 每20秒触发
        bean.setCronExpression("0/20 * * * * ?");
        bean.setJobDetail(jobDetailFactoryBean2().getObject());
        return bean;
    }

    /**
     * 触发器
     * @return
     */
    @Bean
    CronTriggerFactoryBean cronTriggerFactoryBean1() {
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        // 每5秒触发
        bean.setCronExpression("0/5 * * * * ?");
        bean.setJobDetail(jobDetailFactoryBean1().getObject());
        return bean;
    }

    /**
     * SchedulerFactoryBean为调度器
     * @return
     */
    @Bean
    SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 添加Trigger,多个 Trigger 可以用逗号分隔
        bean.setTriggers(simpleTriggerFactoryBean().getObject(), cronTriggerFactoryBean2().getObject());
        //bean.setTriggers(cronTriggerFactoryBean1().getObject(), cronTriggerFactoryBean2().getObject());
        return bean;
    }

    @Bean
    HelloService helloService() {
        return new HelloService();
    }

}

关键的关键还是要自己敲代码,光看不写,理解的还是不深刻,是懂非懂的。 该文章没有几个字,全部靠图片和代码来凑了。

 

需要注意的地方:

***************************
APPLICATION FAILED TO START
***************************

Description:

A component required a bean named 'MyJob0' that could not be found.
Action:Consider defining a bean named 'MyJob0' in your configuration.
Process finished with exit code 0

应用程序启动,说是 MyJob0 这个bean没有找到,但是之前明明用@Component注册过MyJob0 这个类。

解决办法:
方法一:给@Component注解加入value=“MyJob0 ”属性,这样就不怕找不到了

方法二:把QuartzConfig里的bean.setTargetBeanName()里的Bean名称首字母换成小写就好了。

 

运行结果如下:

_江南一点雨 的文章写得非常好,但是一定要自己写代码跑一跑。https://blog.csdn.net/u012702547/article/details/102748267?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159062802619724848342011%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159062802619724848342011&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-2-102748267.pc_v2_rank_blog_default&utm_term=quartz

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值