Spring内置定时任务调度@Scheduled使⽤详解
Spring提供了@Scheduled注解⽤于定时任务。
⼀、@Scheduled的基本使⽤
启⽤调度⽀持:@EnableScheduling
可以将@Scheduled注释与触发器元数据⼀起添加到⽅法中。例如,以下⽅法每隔5秒调⽤⼀次,并具有固定的延迟,这意味着周期是从前⾯每次调⽤的完成时间开始计算的
@Scheduled(fixedDelay=5000)
public void doSomething() {
// something that should execute periodically
}
如果需要固定速率执⾏,可以更改批注中指定的属性名。以下⽅法每5秒调⽤⼀次(在每次调⽤的连续开始时间之间计算)
统筹兼顾的意思@Scheduled(fixedRate=5000)
技校有什么专业public void doSomething() {
// something that should execute periodically
}
对于固定延迟和固定速率任务,可以通过指⽰在⾸次执⾏⽅法之前要等待的毫秒数来指定初始延迟
慢性咽炎茶
@Scheduled(initialDelay=1000, fixedRate=5000)
public void doSomething() {
// something that should execute periodically
}
如果简单的周期性调度不够表达,可以提供cron表达式。例如,以下命令仅在⼯作⽇执⾏:
商业计划书完整版
@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
// something that should execute on weekdays only
}
实现SchedulingConfigurer接⼝,重写configureTasks⽅法:
@Schedule注解的⼀个缺点就是其定时时间不能动态更改,它适⽤于具有固定任务周期的任务,若要修改任务执⾏周期,只能⾛“停服务→修改任务执⾏周期→重启服务”这条路。⽽基于 SchedulingConfigurer 接⼝⽅式可以做到。SchedulingConfigurer 接⼝可以实现在@Configuration等注解类上。
ScheduledTaskRegistrar类包括以下⼏个重要⽅法:
void addTriggerTask(Runnable task, Trigger trigger)
void addTriggerTask(TriggerTask task)
void addCronTask(Runnable task, String expression)
void addCronTask(CronTask task)
void addFixedRateTask(Runnable task, long interval)
void addFixedRateTask(IntervalTask task)
void addFixedDelayTask(Runnable task, long delay)
void addFixedDelayTask(IntervalTask task)
具体实现参考如下:时装店经营
@Component
public class TestTask implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
// 定时任务要执⾏的内容
System.out.println("【开始执⾏定时任务。。。】");
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 定时任务触发,可修改定时任务的执⾏周期
梨的英语怎么说
String cron = "0 0/5 * * * ?"; //可以将表达式配置在数据库中
CronTrigger trigger = new CronTrigger(cron);
藤野先生课件
Date nextExecDate = ExecutionTime(triggerContext);
return nextExecDate;
}
});
}
}
提⽰:如果在数据库修改时格式出现错误,则定时任务会停⽌,即使重新修改正确;此时只能重新启动项⽬才能恢复。
⼆、使⽤@Scheduled注意事项
spring的注解@Scheduled 需要写在实现⽅法上;
定时器的任务⽅法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定⼀个proxytargetclass 的某个值为true),不能指向任何的参数;
如果该⽅法需要与应⽤程序上下⽂的其他对象进⾏交互,通常是通过依赖注⼊来实现;
实现类上要有组件的注解@Component。
三、使⽤@Scheduled常见问题
单线程任务丢失,转为异步线程池
默认的 ConcurrentTaskScheduler 计划执⾏器采⽤wSingleThreadScheduledExecutor() 实现单线程的执⾏器。因此,对同⼀个调度任务的执⾏总是同⼀个线程。如果任务的执⾏时间超过该任务的下⼀次执⾏时间,则会出现任务丢失,跳过该段时间的任务。上述问题有以下解决办法:
采⽤异步的⽅式执⾏调度任务,配置 Spring 的 @EnableAsync,在执⾏定时任务的⽅法上标注 @Async配置任务执⾏池,线程
池⼤⼩ n 的数量为单个任务执⾏所需时间 / 任务执⾏的间隔时间。如下:
//每30秒执⾏⼀次
@Async("taskExecutor")
雨涝@Scheduled(fixedRate = 1000 * 3)
public void reportCurrentTime(){
System.out.println ("线程" + Thread.currentThread().getName() + "开始执⾏定时任务===&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7&&&====》" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
long start = System.currentTimeMillis();
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。