定时任务是开发中比较常见的功能之一,如定时统计订单数、数据库备份、定时统计博客访客等,简单的定时任务可以直接通过Spring中的@Scheduled注解来实现,复杂的定时任务则可以通过集成Quartz来实现。
@Scheduled是由Spring提供的定时任务注解,使用方便,配置简单,可以解决工作中大部分的定时任务需求。使用方式如下:
(1)、创建工程
首先创建一个普通的Spring Boot Web工程,添加Web依赖即可。
(2)、开启定时任务
在项目启动中添加@EnableScheduling注解开启定时任务。
(3)、配置定时任务
定时任务只要通过@Scheduled注解进行配置,代码如下:
@Component
public class MySchedule {
@Scheduled(fixedDelay = 1000)
public void fixedDelay(){
System.out.println("fixedDelay:"+new Date());
}
@Scheduled(fixedDelay = 2000)
public void fixedRate(){
System.out.println("fixedRate:"+new Date());
}
@Scheduled(initialDelay = 1000,fixedDelay = 2000)
public void initialDelay(){
System.out.println("initialDelay:"+new Date());
}
@Scheduled(cron = "0 * * * * ?")
public void cron(){
System.out.println("cron:"+new Date());
}
}
代码解释:
(4)、启动项目
1、Quartz简介
Quartz是一个功能丰富的开源作业调度库,它由java写成,可以集成在任何java应用程序中,包括Java SE和Java EE等。使用Quartz可以创建简单或者复杂的执行计划,它支持数据库、集群、插件以及邮件,并且支持cron表达式,具有极高的灵活性。
2、整合SpringBoot
首先创建SpringBoot项目,添加Quartz依赖。代码如下:
<!-- Quartz依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
然后创建2个Job,代码如下:
@Component
public class MyFirstJob {
public void sayHello(){
System.out.println("MyFirstJob:sayHello:"+new Date());
}
}
public class MySecondJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("hello:"+name+":"+new Date());
}
}
Job可以是一个普通的JavaBean,如果是普通的JavaBean,那么可以先添加@Component注解将之注册到Spring容器中。Job也可以继承抽象类QuartzJobBean,如继承QuartzJobBean,则需要实现该类中的executeInternal方法,该方法在任务被调度的时候使用。
接下来创建QuartzConfig对JobDetail和Trigger进行配置,代码如下:
@Configuration
public class QuartzConfig {
@Bean
MethodInvokingJobDetailFactoryBean jobDetail1(){
MethodInvokingJobDetailFactoryBean bean=new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("sayHello");
return bean;
}
@Bean
JobDetailFactoryBean jobDetail2(){
JobDetailFactoryBean bean=new JobDetailFactoryBean();
bean.setJobClass(MySecondJob.class);
JobDataMap jobDataMap=new JobDataMap();
jobDataMap.put("name","sang");
bean.setJobDataMap(jobDataMap);
bean.setDurability(true);
return bean;
}
@Bean
SimpleTriggerFactoryBean simpleTrigger(){
SimpleTriggerFactoryBean bean=new SimpleTriggerFactoryBean();
bean.setJobDetail(jobDetail1().getObject());
bean.setRepeatCount(3);
bean.setStartDelay(1000);
bean.setRepeatInterval(2000);
return bean;
}
@Bean
CronTriggerFactoryBean cronTrigger(){
CronTriggerFactoryBean bean=new CronTriggerFactoryBean();
bean.setJobDetail(jobDetail2().getObject());
bean.setCronExpression("* * * * * ?");
return bean;
}
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean=new SchedulerFactoryBean();
SimpleTrigger simpleTrigger=simpleTrigger().getObject();
CronTrigger cronTrigger=cronTrigger().getObject();
bean.setTriggers(simpleTrigger,cronTrigger);
return bean;
}
}
代码解释: