Spring Boot:定时任务
Spring 自带的定时任务处理器
在application中添加定时器注解@EnableScheduling
@SpringBootApplication
@EnableScheduling
@MapperScan(basePackages ="touxian_ssm.ssm.Service.**")
public class SsmApplication {
public static void main(String[] args) {
SpringApplication.run(SsmApplication.class, args);
}
}
创建一个MydataPlan
代码如下
package touxian_ssm.ssm.Crontab;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @author 偷闲
* @date 2019/5/17 10:21
*/
@Component
public class MydataPlan {
//fixedRate是两次执行任务之间的时间间隔
@Scheduled(fixedRate = 2000)
public void fixedRate(){
System.out.println("1*"+new Date());
}
//fixedDelay表示任务执行之间的时间间隔,具体是指本次任务结束到下次任务开始之前的时间间隔
@Scheduled(fixedDelay = 2000)
public void fixedDelay(){
System.out.println("2*"+new Date());
}
//initialDelay表示首次任务启动的延迟时间
@Scheduled(initialDelay = 2000,fixedDelay = 2000)
public void initialDelay(){
System.out.println("3*"+new Date());
}
}
但是这种写法只能是过一段时间执行一遍,没法在指定的时间内进行,所有需要使用Cron表达式
cron的参数设置
例子:
//表示每隔五秒钟执行一次
@Scheduled(cron = "0/5 * * * * *")
public void sch2(){
System.out.println("11111");
}
一些常用的Corn表达式
“0 0 10,14,16 * * ?” 每天上午10点,下午2点,4点
“0 0/30 9-17 * * ?” 朝九晚五工作时间内每半小时
“0 0 12 ? * WED” 表示每个星期三中午12点
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? " 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
"/5 * * * * ?” 每隔5秒执行一次
“0 */1 * * * ?” 每隔1分钟执行一次
“0 0 23 * * ?” 每天23点执行一次
“0 0 1 * * ?” 每天凌晨1点执行一次
“0 0 1 1 * ?” 每月1号凌晨1点执行一次
“0 0 23 L * ?” 每月最后一天23点执行一次
“0 0 1 ? * L” 每周星期天凌晨1点实行一次
“0 26,29,33 * * * ?” 在26分、29分、33分执行一次
“0 0 0,13,18,21 * * ?” 每天的0点、13点、18点、21点都执行一次
corn表达式在线生成网站
http://cron.qqe2.com
Quartz定时任务
Quartz在使用过程中,主要有两个关键点
一个是Job(要做的事情)
另一个是触发器
在springboot中使用Quartz需要加入Quartz依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
使用Quartz统一需要在application中开启定时任务注解
@SpringBootApplication
@EnableScheduling
@MapperScan(basePackages ="touxian_ssm.ssm.Service.**")
public class SsmApplication {
public static void main(String[] args) {
SpringApplication.run(SsmApplication.class, args);
}
}
Job
Job有两种定义方式
首先创建job
直接定义一个Bean
在job1中定义
package touxian_ssm.ssm.Quartz.Job;
import org.springframework.stereotype.Component;
/**
* @author 偷闲
* @date 2019/5/24 14:15
*/
@Component
public class Job1 {
public String Job1(){
return "Job1创建成果";
}
}
这种定义方式最大的问题是,无法传入参数
如果你的定时任务不需要传入参数,可以用这种,比较方便
继承QuartzJobBean
这种方式可以传参数
在job2中定义
public class Job2 extends QuartzJobBean {
QuartzService quartzService;
public QuartzService getQuartzService() {
return quartzService;
}
public void setQuartzService(QuartzService quartzService) {
this.quartzService = quartzService;
}
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("错误开始"+new Date());
quartzService.alltype();
}
}
创建一个QuartzService
public class QuartzService {
@Autowired
BookService book_typeservice;
public void alltype(){
System.out.println("正在查询***************"+new Date());
//查询当前表的数据
List<Book_type> alltype= book_typeservice.findall();
System.out.println(alltype.toString());
}
}
定义触发器
创建一个QuartzConfig
/**
* 在QuartzConfig中配置JobBean和Trigger
* JobBean的配置分为两种
* 1 MethodInvokingJobDetailFactoryBean 这种方式不支持传参,所以一般使用在自定义Bean定时任务的时候
* 2. JobDetailFactoryBean 这种方式支持传参可以将参数封装在JobDataMap中进行传递
* Trigger的配置也分为两种
* 1.SimpleTriggerFactoryBean 普通触发器
* 2.CronTriggerFactoryBean Cron表达式触发器
* 配置SchedulerFactoryBean初始化
*/
@Configuration
public class QuartzConfig {
@Bean
MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
MethodInvokingJobDetailFactoryBean bean =new MethodInvokingJobDetailFactoryBean();
//选择目标job名称
bean.setTargetBeanName("job1");
//选择目标方法的名字
bean.setTargetMethod("job1");
return bean;
}
@Bean
JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean bean=new JobDetailFactoryBean();
bean.setJobClass(Job2.class);
JobDataMap map=new JobDataMap();
map.put("quartzService",quartzService());
bean.setJobDataMap(map);
return bean;
}
@Bean
QuartzService quartzService(){
return new QuartzService();
}
//普通触发器
@Bean
SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
SimpleTriggerFactoryBean bean=new SimpleTriggerFactoryBean();
//开始时间
bean.setStartTime(new Date());
//重复次数-1位无限循环
bean.setRepeatCount(5);
//绑定一个job
bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
//时间间隔单位为毫秒
bean.setRepeatInterval(3000);
return bean;
};
//cron表达式触发器
@Bean
CronTriggerFactoryBean cronTrigger(){
CronTriggerFactoryBean bean=new CronTriggerFactoryBean();
bean.setCronExpression("0/10 * * * * ?");
bean.setJobDetail(jobDetailFactoryBean().getObject());
return bean;
}
@Bean
SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean bean=new SchedulerFactoryBean();
bean.setTriggers(simpleTriggerFactoryBean().getObject(),cronTrigger().getObject());
return bean;
}
}
启动项目
错误开始Mon May 27 10:03:10 CST 2019
正在查询***************Mon May 27 10:03:10 CST 2019
[Book_type{id=1, type_name='测试分类1', sort=1, remark='评论'}, Book_type{id=2, type_name='测试分类2', sort=2, remark='类型'}, Book_type{id=3, type_name='测试分类3', sort=3, remark='分类'}, Book_type{id=4, type_name='测试分类4', sort=4, remark='分类'}, Book_type{id=5, type_name='测试分类5', sort=5, remark='分类'}]
Job1创建成果Mon May 27 10:03:12 CST 2019