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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值