spring的定时任务

一、前言

      今天实现了一个要按每天凌晨4点自动拉取数据库数据到文件的需求用到了spring的定时任务,有些不记得了,重新查询资料复习了一下,记录下。

二、关于spring的定时任务---注解方式

      spring的定时任务已经封装的很简单了,一种使用注解的方法简单配置一下就可以实现。这里有用到@EnableSchedulding用来表示开启定时任务放在要实现定时业务代码的类上,其次定时任务有三种方式实现

       在要实现业务代码的方法上使用@Scheduled,主要用到的参数有三个分别如下

 1、@Scheduled(cron = "* 20 18 * * ?")        表示每天下午18点20分执行

例如:

 @Scheduled(cron = "0 20 18 * * ?")
    public void test_1(){

        System.out.println("我是定时任务现在的时间是:"+new Date());

    }

   cron 的字符串有些规则,一般来讲有7个参数,从左至右分别为  秒  分  时  日  月  星期  年

   用 *  表示每的意思 ,?表示不确定的意思,比如上例   “ 0  20  18  *  *  ?” 就是星期几不确定,因为日与星期几都写的话就会冲突,所以总要有一个不确定,同理也可以写为  “ 0  20  18  ? *   *”  这样写的意思是一样的,也是表示每天下午18点20分执行。最后一个参数年可用省略不写,留空即可

 2、@Scheduled(fixedDelay = 1000)         表示该任务执行完后每间隔1秒继续执行

  例如:

 @Scheduled(fixedDelay = 1000)
    public void test_2(){
        //表示该任务执行完后间隔1秒钟后再次执行
        System.out.println("我是定时任务fixedDelay-现在的时间是:"+new Date());
    }

   这种定时任务方式的参数的单位是以毫秒,是等方法内的业务代码执行完毕间隔一定时间才继续执行。

3、@Scheduled(fixedRate = 1000)           表示该任务每隔1秒就执行一次,不论当前任务是否执行完毕

   例如:

   @Scheduled(fixedRate = 1000)
    public void test_3(){
        //表示每间隔1秒执行一次该方法,不论当前任务是否执行完毕
        System.out.println("我是定时任务fixedRate-现在的时间是:"+new Date());
    }

参数单位毫秒,这一种就是间隔一定时间就会执行,不会等当前任务执行完毕

以上就是三种实现方法。当然实现类同样要被spring所管理才行,在类上可用加@Component注解

三、关于spring的定时任务----实现SchedulingConfigurer接口

   1、可用创建一个定时任务类,实现SchedulingConfigurer接口即可。

  例如:

package com.feilonkji.application.utils;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import java.util.Date;

/**
 * @title: ScheduldTest_1
 * @Description: 实现定时任务的另一种方式,通过实现SchedulingConfigurer接口
 * @Author zr
 * @Date:2020/9/21 18:54
 * @Version 1.8
 */
@Configuration
@ComponentScan(value = "com.feilonkji.application.utils")
@EnableScheduling
public class ScheduldTest_1 implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.addFixedRateTask(new Runnable() {
            @Override
            public void run() {
                //通过实现SchedulingConfigurer接口实现定时任务
                //每间隔1秒执行一次
                System.out.println("我是另一种定时任务-现在的时间是"+new Date());
            }
        },1000);

        //另一种,还有其他几种就省略了
        scheduledTaskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是新的定时任务");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //定时任务触发,可修改定时任务的执行周期,每2秒执行一次
                CronTrigger trigger = new CronTrigger("*/2 * * * * ?");
                Date nextExecDate = trigger.nextExecutionTime(triggerContext);
                return nextExecDate;
            }
        });

    }
}

四、任重道远、学无止境

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值