springboot 2.0 教程-08-定时任务和Quartz

阅读原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html
视频教程:https://www.bilibili.com/video/av35595465
课程源码:https://github.com/ibywind/springboot-learn
关注公众号 查看更多技术干货
还可加群 , 众多好基友在等你
mpjpg

springboot 书籍 PDF 下载

扫描关注上方公众号
回复关键字 boot
就可以下载这本书了
书籍的排版很好的,我自己也在看.大家可以一起交流哦
1_png

写在前面

hello 大家好

欢迎大家收看御风大世界

本次课是

springboot 系列教程第8课

我将为大家演示

springboot 如何集成Quartz 来处理定时任务

什么是定时任务?

在项目中我们经常需要实现定时任务

在特定的时间区间 间隔 来执行 既定的程序代码

比如周期性的 页面PV统计

日 周 月 订单总金额统计等等

还需要定时清洗数据 ETL

如果是非常简单的 一些定时任务的话

我们可以考虑使用JDK中的Timer定时任务来实现

主流定时任务框架

目前开源的主流定时任务框架

基于单节点的

Quartz

基于分布式的

当当网 elastic-job

如果大家对于 elastic-job 很感兴趣的话

我后期也会为大家 做这个方面的教程

不过我们公司自己也有 分布式任务的具体实现

由于我们公司自研产品这里我就不方便透露了

具体思路我感觉 都差不多的

elastic-job 作为开源的一个分布式定时任务调度框架

还是很优秀的

之前的公司用到过

OK 我们回来讲解

Quartz

我们来到springboot的官网

这个地方

我们看到 springboot官方解释

默认情况下任务的生命周期 是存储在 内存的

但是 你也可以选择将他们外接到数据存储

springboot集成

首先

我们spirngboot自己就有很好的 定时任务功能

并不需要集成其他 定时任务框架

我们只需要加入这个注解

就可以让springboot开启 定时任务的一些功能

然后我们需要写一个定时任务的代码

这个地方在方法上面加一个 定时任务的注解

给他一个 crontab 表达式 (跟多例子在下面)

到这里就结束了

只要启动springboot项目 这个 定时任务就会随之启动

同时 springboot 也做了一些线程池 异步 的优化

你只需要做一个统一的配置就可以了

这样你的任务 就可以启用多线程的方式来执行了

更加高效

如果你需要用到 quartz 定时任务框架

也是没有问题的

首先需要在pom.xml中引入依赖

然后就可以写代码了

这个地方 定义的是我们定时任务执行的一个 具体逻辑代码

就是你要定时来干什么东西

接下来就是结合quartz框架做一些配置了

这里他采用了 配置 和 逻辑 分离的设计

配置这一块的代码

我们用的是builder 模式

链式编程看起来很爽哦

然后 springboot启动的时候 这个 也是会启动的

我们可以在配置文件中对于quartz做一些配置

这里我之间用默认的就好了

我们需要用到cron表达式 下面这个 希望可以帮到你

三、常用表达式例子

  (1)**0 0 2 1 * ? *** 表示在每月的1日的凌晨2点调整任务

  (2)**0 15 10 ? * MON-FRI ** 表示周一到周五每天上午10:15执行作业

  (3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月最后一个星期五上午10:15执行作

  (4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

  (5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

  (6)0 0 12 ? * WED 表示每个星期三中午12点

  (7)0 0 12 * * ? 每天中午12点触发

  (8)**0 15 10 ? * * ** 每天上午10:15触发

  (9)0 15 10 * * ? 每天上午10:15触发

  (10)**0 15 10 * * ? * ** 每天上午10:15触发

  (11)0 15 10 * * ? 2005 2005年的每天上午10:15触发

  (12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发

  (13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发

  (14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

  (15)**0 0-5 14 * * ? ** 在每天下午2点到下午2:05期间的每1分钟触发

  (16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发

  (17)**0 15 10 ? * MON-FRI ** 周一至周五的上午10:15触发

  (18)**0 15 10 15 * ? ** 每月15日上午10:15触发

  (19)**0 15 10 L * ? ** 每月最后一日的上午10:15触发

  (20)**0 15 10 ? * 6L ** 每月的最后一个星期五上午10:15触发

  (21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月最后一个星期五上午10:15触发

  (22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

代码和测试

这块是 quartz框架 打印出来的一些信息

我们会发现 两种方式的 定时任务都启动了

整个过程很顺利

结束语

如果大家对于这里比较感兴趣的话

可以去B站查看我的视频讲解

https://space.bilibili.com/193580090/#/

或者是在 github下载源码

https://github.com/ibywind/springboot-learn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot是一个非常流行的Java Web框架,而mybatis-plus是一个非常强大的ORM框架,两者合起来可以实现非常好用的定时任务管理。 下面是基于SpringBoot和mybatis-plus实现定时任务管理的步骤: 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.3.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> </dependencies> ``` 2. 配置数据库 在application.properties文件中添加以下配置: ``` # 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # mybatis-plus配置 mybatis-plus.mapper-locations=classpath:/mapper/*.xml # Quartz配置 org.quartz.scheduler.instanceName = QuartzScheduler org.quartz.scheduler.instanceId = AUTO org.quartz.threadPool.threadCount=10 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=123456 org.quartz.dataSource.myDS.maxConnections=5 ``` 3. 创建实体类和Mapper 创建一个定时任务的实体类,并在其中定义定时任务的属性: ```java @Data public class JobEntity { /** * 任务ID */ private String jobId; /** * 任务名称 */ private String jobName; /** * 任务分组 */ private String jobGroup; /** * 任务执行类 */ private String jobClass; /** * 任务描述 */ private String jobDescription; /** * 任务状态 0禁用 1启用 */ private Integer jobStatus; /** * 任务表达式 */ private String jobExpression; /** * 创建时间 */ private Date createTime; /** * 修改时间 */ private Date modifyTime; } ``` 创建一个定时任务的Mapper,并继承mybatis-plus的BaseMapper: ```java @Repository public interface JobMapper extends BaseMapper<JobEntity> { } ``` 4. 创建定时任务工具类 创建一个定时任务的工具类,用于实现定时任务的添加、删除、暂停和恢复等操作: ```java @Service public class QuartzService { @Autowired private Scheduler scheduler; /** * 添加任务 * * @param jobEntity */ public void addJob(JobEntity jobEntity) throws SchedulerException, ClassNotFoundException { // 获取任务类 Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(jobEntity.getJobClass()); // 创建任务 JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(jobEntity.getJobName(), jobEntity.getJobGroup()) .withDescription(jobEntity.getJobDescription()) .storeDurably(true) .build(); // 创建触发器 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(jobEntity.getJobName(), jobEntity.getJobGroup()) .withSchedule(CronScheduleBuilder.cronSchedule(jobEntity.getJobExpression())) .build(); // 将任务和触发器添加到调度器 scheduler.scheduleJob(jobDetail, trigger); } /** * 删除任务 * * @param jobId * @param jobGroup */ public void deleteJob(String jobId, String jobGroup) throws SchedulerException { JobKey jobKey = new JobKey(jobId, jobGroup); scheduler.deleteJob(jobKey); } /** * 暂停任务 * * @param jobId * @param jobGroup */ public void pauseJob(String jobId, String jobGroup) throws SchedulerException { JobKey jobKey = new JobKey(jobId, jobGroup); scheduler.pauseJob(jobKey); } /** * 恢复任务 * * @param jobId * @param jobGroup */ public void resumeJob(String jobId, String jobGroup) throws SchedulerException { JobKey jobKey = new JobKey(jobId, jobGroup); scheduler.resumeJob(jobKey); } } ``` 5. 创建定时任务控制器 创建一个定时任务的控制器,用于实现定时任务的增删改查等操作: ```java @RestController @RequestMapping("/job") public class JobController { @Autowired private JobMapper jobMapper; @Autowired private QuartzService quartzService; /** * 添加任务 * * @param jobEntity */ @PostMapping("/add") public void addJob(@RequestBody JobEntity jobEntity) throws SchedulerException { // 添加任务 quartzService.addJob(jobEntity); // 保存任务到数据库 jobMapper.insert(jobEntity); } /** * 删除任务 * * @param jobId * @param jobGroup */ @DeleteMapping("/delete") public void deleteJob(String jobId, String jobGroup) throws SchedulerException { // 删除任务 quartzService.deleteJob(jobId, jobGroup); // 从数据库中删除任务 QueryWrapper<JobEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("job_id", jobId); queryWrapper.eq("job_group", jobGroup); jobMapper.delete(queryWrapper); } /** * 暂停任务 * * @param jobId * @param jobGroup */ @PutMapping("/pause") public void pauseJob(String jobId, String jobGroup) throws SchedulerException { // 暂停任务 quartzService.pauseJob(jobId, jobGroup); // 更新任务状态 JobEntity jobEntity = new JobEntity(); jobEntity.setJobId(jobId); jobEntity.setJobGroup(jobGroup); jobEntity.setJobStatus(0); jobMapper.updateById(jobEntity); } /** * 恢复任务 * * @param jobId * @param jobGroup */ @PutMapping("/resume") public void resumeJob(String jobId, String jobGroup) throws SchedulerException { // 恢复任务 quartzService.resumeJob(jobId, jobGroup); // 更新任务状态 JobEntity jobEntity = new JobEntity(); jobEntity.setJobId(jobId); jobEntity.setJobGroup(jobGroup); jobEntity.setJobStatus(1); jobMapper.updateById(jobEntity); } /** * 获取任务列表 * * @return */ @GetMapping("/list") public List<JobEntity> listJob() { return jobMapper.selectList(null); } } ``` 至此,基于SpringBoot和mybatis-plus实现定时任务管理的步骤就完成了。我们可以通过访问控制器提供的接口来实现定时任务的添加、删除、暂停和恢复等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值