【十】springboot整合quartz实现定时任务优化

互相交流入口地址 

整体目录:

【一】springboot整合swagger

【二】springboot整合自定义swagger

【三】springboot整合token

【四】springboot整合mybatis-plus

【五】springboot整合mybatis-plus

【六】springboot整合redis

【七】springboot整合AOP实现日志操作

【八】springboot整合定时任务

【九】springboot整合redis实现启动服务时热点数据保存在全局和缓存

【十】springboot整合quartz实现定时任务优化

【十一】springboot整合异步调用并获取返回值

【十二】springboot整合WebService

【十三】springboot整合WebService关于传参数

【十四】springboot整合WebSocket

【十五】springboot整合WebSocket实现聊天室

【十六】RabbitMQ基础篇(下载安装并基础使用,内含各种坑问题)

【十七】RabbitMQ基础篇(延迟队列和死信队列实战)

【十八】springboot实现自定义全局异常处理

【十九】初学Kafka并实战整合SpringCloudStream进行使用

【二十】springboot整合ElasticSearch实战(万字篇)

【二十一】springboot整合过滤器实战

【二十二】springboot整合拦截器实战并对比过滤器

【二十三】springboot整合activiti7(1)实战演示篇

【二十四】springboot整合spring事务详解以及实战

【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透

【二十七】springboot实现多线程事务处理

【二十八】springboot之threadLocal参数解析器实现session一样保存当前登录功能 

【二十九】springboot整合logback实现日志管理

【三十】springboot项目上高并发解决示例

目录

第一步:导入Pom依赖

第二步:改造各层代码

第三步:新增Job

第四步:新增quartz配置类(编写Trigger和Detail)

第五步:演示


        介绍:接下来我会把学习阶段学到的框架等知识点进行整合,每一次整合是在前一章的基础上进行的,所以后面的整合不会重复放前面的代码。每次的demo我放在结尾,本次是接着上一章的内容延续的,只增加新增的或者修改的代码。

        上一章是改造整合redis实现启动服务即将热点数据保存在全局以及redis中,方便其他接口使用,本章整合quartz框架,实现定时任务的优化,前面整合的定时任务是使用的spring的Scheduled注解方式实现的,本章整合quartz任务调度框架。

Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。而Scheduled只适合处理简单的计划任务。

Quartz的主要组件有Detail,Trigger,Scheduler以及Job,大概流程就是(我自己的话来说,不一定正确),新建一个Job,在Job里面写自己的逻辑,新建一个配置类,里面建立Detail方法来绑定Job,再新建Trigger方法,在方法里新建一个Scheduler,并在该Trigger方法里绑定Detail和Scheduler,让该Scheduler执行Detail,一个Detail绑定一个Job。

        先展示一下我的目录结构:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        勾选部分为相比上一章新增部分。

第一步:导入Pom依赖

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

第二步:改造各层代码

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        新增了两个方法,一个查询code表中的用户数量(用于测试),一个修改用户数量。

第三步:新增Job

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        ps:新增Job类继承QuartzJobBean,并重写QuartzJobBean的executeInternal方法。注意此处的jobExecutionContext参数,在Detail绑定该Job之后,可以传参数过来,通过该参数可以在Job中获取传过来的参数。获取方式如上图。该Job用来修改用户数量。

第四步:新增quartz配置类(编写Trigger和Detail)

@Configuration
public class QuartzConfiguration {

    @Bean
    public JobDetail MyJob1JobDetail(){
        return JobBuilder.newJob(MyJob1.class)//PrintTimeJob我们的业务类
                .withIdentity("MyJob1")//可以给该JobDetail起一个id
                //每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
                .usingJobData("MyJob1", "Hello Quartz")//关联键值对
                .storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
                .build();
    }
    @Bean
    public Trigger MyJob1JobTrigger() {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/30 * * * * ? *");//每30秒执行
        return TriggerBuilder.newTrigger()
                .forJob(MyJob1JobDetail())//关联上述的JobDetail
                .withIdentity("MyJob1JobTrigger")//给Trigger起个名字
                .withSchedule(cronScheduleBuilder)
                .build();
    }

    @Bean
    public JobDetail MyJob2JobDetail(){
        return JobBuilder.newJob(MyJob2.class)//PrintTimeJob我们的业务类
                .withIdentity("MyJob2")//可以给该JobDetail起一个id
                //每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
                .usingJobData("MyJob2", "Hello Quartz")//关联键值对
                .storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
                .build();
    }
    @Bean
    public Trigger MyJob2JobTrigger() {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/30 * * * * ? *");//每30秒执行
        return TriggerBuilder.newTrigger()
                .forJob(MyJob2JobDetail())//关联上述的JobDetail
                .withIdentity("MyJob2JobTrigger")//给Trigger起个名字
                .withSchedule(cronScheduleBuilder)
                .build();
    }

}

        ps:不要忘记Configuration注解。下面解释Detail和Trigger的编写。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        newJob是设置需要绑定的Job的类型,withIdentity是给该detail取个名字,usingJobData是给该detail存储数据,可以在绑定的Job中通过Context获取此处绑定的值通过key-value方式获取。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        新建一个CronScheduleBuilder用来维护定时任务环境,并让触发器生效,可以设置cron表达式,forJob设置需要启用的Detail的类,withIdentity是给该Trigger取名,withSchedule是绑定Schedule。

第五步:演示

        操作:启动项目,请求查询用户数量接口,等待30秒再次查询。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        等待30秒。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        控制台打印:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCPeuKZgA==,size_20,color_FFFFFF,t_70,g_se,x_16

        可以看到在Job中获取Detail传过来的值,获取成功。

        本期整合到此完毕,接下来会继续更新加强整合,尽情期待。

        访问地址:http://localhost:8087/swagger-ui.html或者http://localhost:8087/doc.html

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析QuartzSpring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。
当您需要将Quartz任务存储在数据库中时,可以使用Quartz提供的`JobStoreTX`和`JobStoreCMT`来实现。 首先,您需要在Spring Boot项目中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.2</version> </dependency> ``` 接下来,您需要创建一个Quartz配置类,用于配置Quartz的相关属性和任务: ```java @Configuration public class QuartzConfig { @Autowired private DataSource dataSource; @Autowired private ApplicationContext applicationContext; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setJobFactory(springBeanJobFactory()); schedulerFactoryBean.setDataSource(dataSource); schedulerFactoryBean.setQuartzProperties(quartzProperties()); // 其他配置属性... return schedulerFactoryBean; } @Bean public SpringBeanJobFactory springBeanJobFactory() { AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); return jobFactory; } @Bean public Properties quartzProperties() { Properties properties = new Properties(); properties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); properties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"); properties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_"); properties.setProperty("org.quartz.jobStore.isClustered", "false"); properties.setProperty("org.quartz.jobStore.dataSource", "quartzDataSource"); properties.setProperty("org.quartz.dataSource.quartzDataSource.driver", "org.postgresql.Driver"); properties.setProperty("org.quartz.dataSource.quartzDataSource.URL", "jdbc:postgresql://localhost:5432/quartz"); properties.setProperty("org.quartz.dataSource.quartzDataSource.user", "quartz"); properties.setProperty("org.quartz.dataSource.quartzDataSource.password", "quartz"); properties.setProperty("org.quartz.dataSource.quartzDataSource.maxConnections", "10"); return properties; } } ``` 然后,您需要创建一个定时任务的类,继承`QuartzJobBean`并实现`executeInternal`方法: ```java public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { // 在这里编写定时任务的逻辑 System.out.println("Hello Quartz!"); } } ``` 接下来,您可以在数据库中创建Quartz相关的表。您可以使用Quartz提供的`quartz_tables_postgres.sql`脚本来创建PostgreSQL数据库表。 最后,在您的应用程序中,您可以使用`@Scheduled`注解来触发定时任务: ```java @Component public class MyScheduledTasks { @Scheduled(cron = "0/10 * * * * ?") public void runJob() { // 在这里编写定时任务的逻辑 System.out.println("Hello Scheduled Tasks!"); } } ``` 这样,您的定时任务将会存储在数据库中,并由Quartz进行调度执行。希望对您有所帮助!如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小z♂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值