- 前言
- 项目里定时任务的运用也很常见,包括定时同步数据,定时推送消息,定时删除一些过期日志文档等等作用。下面是两种方式去实现定时任务。
- Scheduled工具类
第一步:首先在项目启动类里加上注解@EnableScheduling。作用是发现注解@Scheduled的任务并由后台执行。没有它的话将无法执行定时任务。
第二步:直接使用@Scheduled(cron = “0/5 * * * * ?”)加上cron表达式写自己的逻辑方法。
@Component
public class ScheduledTasks {
private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
@Scheduled(cron = "0/5 * * * * ?")
public void testCron() {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("*********每5秒执行一次:" + LocalDateTime.now());
}
}
可以在控制台输出的信息中看到每过5秒就会执行一次。简单,快捷方便。
- Quartz
第一步:添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
第二步:继承QuartzJobBean类,重写executeInternal方法,写入自己的逻辑。
public class MyCronJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务执行了" + new Date());
// indexController.testMail();
}
}
第三步:这里的配置和xml里的配置是一个意思。
@Configuration
public class QuartzConfiguration {
// 使用jobDetail包装job
@Bean
public JobDetail myCronJobDetail() {
return JobBuilder.newJob(MyCronJob.class).withIdentity("myCronJob").storeDurably().build();
}
// 把jobDetail注册到Cron表达式的trigger上去
@Bean
public Trigger CronJobTrigger() {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/59 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(myCronJobDetail())
.withIdentity("myCronJobTrigger")
.withSchedule(cronScheduleBuilder)
.build();
}
}
控制台打印信息:
总结:先记录下来,调通,再慢慢理解内部的原理。