1:注意:使用cron在线生成器调试https://cron.qqe2.com/,看调试结果是否符合自己的要求
1、实现类上要有组件的注解@Component @Service(@Component相当于一个bean);
2、spring的@Scheduled注解 需要写在实现方法上,如:@Scheduled("cron = “0 0 0 * * ?”) (表示每天0点的定时任务);
3、定时器的任务实现方法内不能有返回值。
三、示例
0 * * * * ? 每1分钟触发一次
0 0 * * * ? 每天每1小时触发一次
0 0 10 * * ? 每天10点触发一次
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 30 9 1 * ? 每月1号上午9点半
0 15 10 15 * ? 每月15日上午10:15触发
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0 0 1 * ? 每月1号凌晨执行一次
/**
* @Author xu
* @create 2022/11/16
*/
@Service
@EnableScheduling
public class VibratorTableTask {
@Autowired
VibratorMapper vibratorMapper;
/**
* 定时生成震动器数据表,根据时间分表
*/
//定时器每10分钟执行一次
@Scheduled(cron = "0 */10 * * * * ")
//定时器每1小时执行一次
// @Scheduled(cron = "0 0 */1 * * * ")
// 单位是微妙
// @Scheduled(fixedRate=1000)
// @Scheduled(fixedDelay=1000)
public void createTable() {
//TODO someting
}
}
介绍及区别说明:
FixedRate----- > @Scheduled(fixedRate=5000)
第一个任务开始时间秒数为00:00:10;那么在5秒之后,15秒的时候,第二个任务就会立刻执行的。 若第一个任务执行划分10秒,第> > 二个任务的执行并不会受影响,还是会在00:00:15秒的时候执行。
FixedDelay---- > @Scheduled(fixedDelay=5000)
第一个任务开始时间秒数为00:00:10;那么第二个任务执行的时候,必须是第一个任务执行完再等5秒之后才能执行。 若第一个任务执行花费10秒,那么就说00:00:10++10+5秒,也就是00:00:25秒的时候,第二个任务才会执行。
2:@Scheduled是单线程的,可以设置线程吃使用方法
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(5); // 设置线程池大小
taskScheduler.setThreadNamePrefix("scheduled-task-pool-"); // 设置线程名称前缀
taskScheduler.initialize();
return taskScheduler;
}
注意:调度器多线程是对应多个@Scheduled而言可以并发执行的,类似execute(),定时每两秒执行一次,但是方法体睡眠了10秒,所以最终是12秒执行一次循环。如果没有调度器多线程,就需要排队,执行完一个@Scheduled方法execute(),再执行@Scheduled方法execute2()
@Scheduled(cron = "*/2 * * * * ?")
public void execute() throws InterruptedException {
System.out.println("开始A:"+Thread.currentThread().getName()+":"+ new Date());
Thread.sleep(10000);
System.out.println("结束A:"+Thread.currentThread().getName()+":"+ new Date());
}
@Scheduled(cron = "*/2 * * * * ?")
public void execute2() throws InterruptedException {
System.out.println("开始B:"+Thread.currentThread().getName()+":"+ new Date());
Thread.sleep(10000);
System.out.println("结束B:"+Thread.currentThread().getName()+":"+ new Date());
}