admin管理员组文章数量:1794759
SpringBoot Schedule的三种使用方式
SpringBoot Schedule的三种使用方式
- 静态schedule
- 结果图
- 动态schedule
- schedule代码
- 结果图
- mapper代码
- application.yml文件配置
- pom依赖
- 异步Schedule
- 多个定时器同步执行代码
- 结果图
- 多个定时器异步执行代码
- 结果图
这种静态的定时器的通过@Scheduled(cron=“cron表达式”) 控制定时任务执行。 该方法实现简单,但不宜更改,如果想要更改定时任务则需要重写cron表达式,同时重新启动项目,不方便。
动态schedule动态schedule可以根据数据库中的数据,“动态改变” 定时任务
schedule代码给出两种表达方式 1、匿名内部类方式 2、 lambda方式 在使用时,以上两种方式认选一种即可,必须将另一种注释或者删除掉
import com.example.spring.ScheduleMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import java.time.LocalTime; @Configuration @EnableScheduling public class Schedule_2 implements SchedulingConfigurer { @Autowired ScheduleMapper scheduleMapper; // 匿名内部类形式 // @Override // public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // taskRegistrar.addTriggerTask(new Runnable() { // @Override // public void run() { // System.err.println("【动态】执行定时任务:" + LocalTime.now().toString() + "\\n"); // } // }, new Trigger() { // @Override // public Date nextExecutionTime(TriggerContext triggerContext) { // Integer id = 1; // String cron = scheduleMapper.getCronById(id); // System.out.println("cron表达式为:" + cron); // // 此处的cron可以从数据库中获取 重点 // return new CronTrigger(cron).nextExecutionTime(triggerContext); // } // }); // } // lambda表达式形式 @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(() -> { System.err.println("【动态】执行定时任务:" + LocalTime.now().toString() + "\\n"); }, (triggerContext) -> { Integer id = 1; String cron = scheduleMapper.getCronById(id); System.out.println("cron表达式为:" + cron); // 此处的cron可以从数据库中获取 重点 return new CronTrigger(cron).nextExecutionTime(triggerContext); }); } } 结果图在项目运行时,改变数据库中的cron表达式
mapper代码这里只是做了简单的查询,根据id查找表中的cron字段数据
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @Mapper public interface ScheduleMapper { @Select("select cron from schedule_config where id = #{id}") public String getCronById(int id); } application.yml文件配置对数据库进行配置
spring: #JDBC datasource: username: root password: root url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8 driver-class-name: com.mysql.cj.jdbc.Driver pom依赖项目为springboot项目,在这里我选用mybatis-plus,在实际使用中,可以根据自身情况随意选择
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> 异步Schedule 多个定时器同步执行代码多个同步定时器执行,会等待上一个定时器完成任务后,再执行后续的定时器!!!
import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import java.time.LocalTime; @Configuration @EnableScheduling public class Schedule_3 { @Scheduled(cron = "0/1 * * * * ?") public void s1() throws InterruptedException { Thread.sleep(5000); System.out.println("【同步1】执行定时任务:" + LocalTime.now().toString()); } @Scheduled(cron = "0/1 * * * * ?") public void s2() { System.err.println("【同步2】执行定时任务:" + LocalTime.now().toString()); } } 结果图 多个定时器异步执行代码 import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import java.time.LocalTime; @Configuration @EnableScheduling @EnableAsync public class Schedule_3 { @Async @Scheduled(cron = "0/1 * * * * ?") public void s1() throws InterruptedException { Thread.sleep(5000); System.out.println("【异步1】执行定时任务:" + LocalTime.now().toString()); } @Async @Scheduled(cron = "0/1 * * * * ?") public void s2() { System.err.println("【异步2】执行定时任务:" + LocalTime.now().toString()); } } 结果图本文标签: 三种方式SpringBootschedule
版权声明:本文标题:SpringBoot Schedule的三种使用方式 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686481576a72392.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论