前言
- 传统定时器是硬编码 。但是有的时候业务上需要不断地调整
- 我们开发了一个定闹钟的功能 。这个功能肯定是定时器开发 。但是这就存在一个问题这个定时是动态的 。那么我们如何实现呢?请接着看
- 定时器在开发中真的算是一种福利了 。通过定时器我们省去了很多人力 。我们通过定时器将一些繁琐定期的事情通过代码去完成 。在JAVA开发中我们通过Timer类可以简单实现定时器功能 。既然是springboot课程今天我们就来看看srpingboot整合定时器的事情
- 这里使用的是之前课程一的配置 。springboot打算是系列讲解 。所以配置都是承前启后的 。建议大家按顺序观看 。
@Componentpublic class SimpleSchedule {@AutowiredTestMApper testMapper;@Scheduled(cron = "*/6 * * * * ?")private void process() {List<test> tests = testMapper.getTests();System.out.println(tests);}}
- 定时器的编写也很简单,只需要在类或者方法上加上@Scheduled注解 。然后配置cron表达式就可以了 。这里得注意一下需要在spirngboot启动类上加上开发定时器的注解 。
@SpringBootApplicationpublic class CrontabApplication {public static void main(String[] args) {SpringApplication.run(CrontabApplication.class, args);}}
文章插图
- 代码中我们使用的是最简单的一种方式 。
- cron表达式:指定任务在特定时间执行
- fixedDelay:表示上一次任务执行完成后多久再执行,参数类型long,单位:ms
- fixedDelayString:与fixedDelay一样,只是参数类型是String
- fixedRate:表示按一定的频率执行任务,参数类型long,单位:ms 如: fixedRate(5000),表示这个定时器任务每5秒执行一次
- fixedRateString:与fixedRate一样,只是参数类型变为String
- initialDelay:表示延迟多久再第一次执行任务,参数类型为long ,单位:ms
- initialDelayString:与initialDelay一样,只是参数类型String
- 上面的定时器已经成功的配置了 。但是现在有一个需求客户想通过页面定制配置定时器执行的频率 。上面代码我们是写死6S执行一次 。如果客户想通过可视化配置 。配置完成之后我总不能再手动改写代码吧 。那么动态定时器就产生了 。
- 既然动态我们就得将客户配置的数据进行本地化 。当然是存储在数据库中 。
文章插图
- 对应的我们新建Mapper查询定时任务信息 。因为这里只配置了表达式 。没有配置表达式对应的定时器 。也是为了测试 。这里默认表达式就是一个 。
@Configurationpublic class ScheduleConfigV1 implements SchedulingConfigurer {@AutowiredCronMapper cronMapper;@AutowiredTestMapper testMapper;@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {scheduledTaskRegistrar.addTriggerTask(()-> {System.out.println("执行定时器任务:" + LocalDateTime.now().toLocalTime());List<test> tests = testMapper.getTests();System.out.println(tests);},triggerContext -> {List<cron> crons = cronMapper.getCron();Cron cron = crons.get(0);return new CronTrigger(cron.getCron()).nextExecutionTime(triggerContext);});}}
- 执行这个代码我们最好先关掉前面那个静态的定时器 。这样看的效果明显点 。首先数据库配置的是6秒执行一次 。然后把数据改成2秒执行一次 。看看效果 。
文章插图
文章插图
- 我们发现只要数据库信息修改了 。定时任务会自动修改频率的 。最重要的是不需要重启我们的代码 。
- 上面虽然是动态配置了 。但是有一个缺点 。就是修改之后生效是在下一次触发定时器执行后有效 。说白了就是一开始一小时执行一次,在这期间修改了不能立马生效必须得到下一次一小时才会去刷新配置 。这里的动态可以理解成懒动态 。
- 上面的功能虽然是动态的 。但是对于量产的话肯定是不科学的 。首先数据库不可能只存一条数据的 。
- 如果存多条数据那么多条定时规则与具体的定时器怎么进行匹配呢?
- 既然是动态的那么如何通过数据库控制定时器的开关呢?
推荐阅读
- SpringBoot的可视化接口开发工具
- SSM三大框架整合详细教程
- SpringBoot:拒绝大文件,夏天到了,来给jar包瘦个身
- mybatis-plus整合clickhouse
- Springboot 动态设置注解参数值
- 聊一聊 SpringBoot 中配置加载优先级?
- 一文搞懂GoLang定时器实现原理
- springboot三种拦截器
- SpringBoot集成多数据源
- SpringBoot整合RabbitMQ四种交换机类型详解