ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

quartz配合springboot使用的坑与记录

2019-08-19 22:51:45  阅读:582  来源: 互联网

标签:触发 quartz springboot 记录 spring job trigger jobdetail


公司项目需要用到任务调度,所以用上了quartz。

目前是试过两种spring版本的集成,1.5.9跟2.0.3版本,有所区别。

1.5的spring并没有提供专门的start启动类,所以很多东西都要自己手动写,而2.0提供有start,方便很多。

quartz工作原理:由schedule来调度一个任务,而任务由trigger和jobdetail组成,jobdetail调用job来实现业务规则,这里借用一张图:

通常来讲,一个jobdetail和一个trigger是对应的,他们将设定同一个group名。trigger有简单trigger,也有cronTrigger,作用是指定触发规则(触发几次、间隔多少等)。而jobdetail用来指定一个job和部分调度规则,我们要把我们实现的业务规则写到job里面。jobdetail还有一个作用是给job传递一些参数(坑1:遗憾的是只有基础类型,你无法传递一个Object)。

坑2:很蛋疼的是,schedule的生成并不参与spring的bean生命周期管理,这意味着你无法在job里写业务规则的时候使用@autowire!为此,spring提供了专门的工厂类来解决这个问题。

除此之外,quartz还未trigger、job、schedule提供了响应的监听器,让你可以对他们的生命周期做出响应的处理,比如说一个任务触发前该做什么,触发后/结束后该做什么。

如果你将quartz设置为持久化到数据库中,那么以上的设定都是可以持久化的(坑3:低版本quartz的job分为静态非静态,静态job的jobdetail数据无法持久化到库中),除了监听器。

想让监听器在服务重启后一样有效的解决方法也很简单,配置一个全局的监听类就可以了,在监听类中可以用group来区别不同的调度类型,做出不同的处理。

坑4:cron类型的触发和简单触发似乎完全区别开,简单触发可以指定触发次数,而cron规则不能指定次数,要指定触发次数,似乎只能手动计数,然后在监听器中手动停掉。

 

首先是2.0的start集成方式:

yml配置

spring:
  quartz:
    #相关属性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: quartzScheduler
            instanceId: AUTO
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true

这个配置并没有实现持久化,也没有实现集群,是最简单的配置。

job需要集成QuartzJobBean

public class MyJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("任务启动");
    }
}

最后需要一个配置类QuartzConfiguration

@Configuration
public class QuartzConfiguration {
    @Bean
    public JobDetail myJobDetail() {
        return JobBuilder.newJob(MyJob.class).withIdentity("myJob").storeDurably().build();
    }

    // 把jobDetail注册到trigger上去
    @Bean
    public Trigger myJobTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(15).repeatForever();

        return TriggerBuilder.newTrigger()
                .forJob(myJobDetail())
                .withIdentity("myJobTrigger")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

非常简洁,你不需要手动去启动调度,只需要像这样,把job、trigger注入,就可以使用了。

标签:触发,quartz,springboot,记录,spring,job,trigger,jobdetail
来源: https://www.cnblogs.com/chrisweiii/p/11380300.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有