(五)springboot入门之定时任务

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

###写在前面的
在项目开发中定时任务是一种常用的功能,比如应用中每天进行的一次数据分析,或者每隔一段时间进行一次权限验证等,这类功能的实现一般都是使用定时任务。使用定时任务简化了我们开发这类功能的逻辑,不用编写开始执行时间的逻辑,只有编写执行内容的逻辑,是开发更便捷。
###一、定时任务的实现方式简述
######(1)使用jre自带的java.util.Timer类和java.util.TimerTask类实现定时任务
这种方式来实现定时任务过程稍显复杂,而且timerTask 也是实现了 java.lang.Runnable 接口的,所以事实上timerTask 就是一类线程,而且这类线程的调度还不可控,容易出现差错。这种方式的定时任务在日常开发中很少使用,所以在这里就不过多介绍。

这只是个人见解,如果需要了解更多可以自行查阅资料

######(2)使用Spring的task实现定时任务
这种定时任务的实现方式是在Spring3.0以后才提供的,Spring提供的这个功能可以看做是一个轻量级的Quartz,配合Spring使用比较简单便捷。

本篇着重介绍这一种方式

######(3)使用Quartz实现定时任务
Quartz是OpenSymphony组织的一个开源项目,它是一个功能强大的任务调度器,可以与J2EE与J2SE应用程序相结合也可以单独使用。

由于Quart功能强大所以使用起来也比较复杂,本人对Quart还没有深入学习,目前还不能谈太多,等学习后再来与大家交流

###二、使用@Scheduled创建定时任务
创建一个定时任务类,示例如下

@EnableScheduling
@Configuration
public class MyTask {
    private static Logger logger = Logger.getLogger(MyTask.class.getName());
	//corn 是定时任务表达式
	//corn 表达式共七项分别代表
	//秒 分 时 日 月 星期 年(可选)
	//想了解更多corn表达式可以自行查阅资料
    @Scheduled(cron = "0/2 * * * * *")
    public void task(){
        logger.info(new Date()+"task");
    }
}

在这里要说明的是:Spring提供的定时任务的执行时间是根据程序所运行的操作系统的时间来调度,而且时间间隔的计算是从0开始。

解释从0开始的含义------例如corn= ( 0/5 * * * * *)代表是每隔5秒执行一次,假如程序在00:00:02秒时启动成功,按照我们思维下次执行时间应该为07秒,12秒,17秒…,其实实际并不是这样,这里是从0开始划分,下次执行时间为05秒,10秒,15秒…

###三、使用SchedulingConfigurer接口实现定时任务
代码示例如下

@EnableScheduling
@Configuration
public class MyTaskCorn implements SchedulingConfigurer {
    private static Logger logger = Logger.getLogger(MyTaskCorn.class.getName());
    private static String corn = "0/2 * * * * *";

    public static boolean changeCorn(String corn){
        //在此处可以做corn表达式校验
        if(corn==null||"".equals(corn.trim())){
            return false;
        }
        MyTaskCorn.corn = corn;
        return true;
    }
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        Runnable task = new Runnable() {
            @Override
            public void run() {
                logger.info(new Date()+"----MyTaskCorn");
            }
        };
        Trigger trigger = new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                CronTrigger cronTrigger = new CronTrigger(corn);
                return cronTrigger.nextExecutionTime(triggerContext);
            }
        };
        scheduledTaskRegistrar.addTriggerTask(task,trigger);
    }
}

这种方式的好处是可以在程序的运行中修改corn的值,从而改变任务的执行计划,同时也可以动态的添加任务。

更多方式留着大家探索吧,本人也了解甚微,就谈这么多吧。

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值