• SpringBoot实现定时任务的三种方式


    第一种我们可以使用java原生提供的api去实现一个定时任务

    利用Timer这个api,去实现定时任务,用Timertask去创建一个任务

    public class javaJob {
        public static void main(String[] args) {
            //利用java的api Timer来完成一个定时任务
            Timer timer = new Timer();
            //其实这个技术也是基于java的线程去做的
            TimerTask task=new TimerTask() {
                @Override
                public void run() {
           System.out.println("这是一个定时任务");
                }
            };
            timer.schedule(task,0,2000);
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    其中完成定时的 timer.schedule(task,0,2000);

    解释一下这个里面的含义,首先task这个就是你要定时的一个任务,delay代表延迟多久执行,我们这里为了测试设置为0就就是不延迟,period就是每个多久执行一次,我们为了看到效果设置为2000,也就是2秒执行一次

    下面来看效果

    好了这个时候我们利用javaAPI做的一个定时任务就是完成了,其实这个就是基于java多线程去做的

    但是现在在我们企业级应用中定时任务的应用非常广泛,于是就出现了完成定时任务的技术

    比如Quarze,这个技术在现在市面上非常流行

    你要想在springboot中整合这个技术,我们首先来了解几个词

    >工作(job):用于执行具体的任务

    >工作明细(jobDetail):用于定义定时工作的信息

    >触发器(Trigger):用于描述触发工作的规则,和定义调度通常用Cron来进行定义调度的规则

    >调度(scheduler):用于描述工作明细和触发器之间的关系

    理解以上的四个词的含义我们来进行整合Quarze

    1.第一步就是来导入整合Quarze的坐标

     
                org.springframework.boot
                spring-boot-starter-quartz
            
    
    • 1
    • 2
    • 3
    • 4

    因为springboot中已经提供了版本号了我们这里就用springboot提供的默认版本号

    2,这里我们不需要做Quarze的配置,我们要做的是去继承一个quarze的一个抽象类QuartzJobBean,代表这个是一个Job然后是实现这个抽象类中的方法就是我们具体的工作

    public class Myquartz extends QuartzJobBean {
        @Override
        protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
            System.out.println("hhhh我是quartz");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这里我们就完成我们上面所讲的一个工作的创建。

    创建完一个job后我们是不是要创建一个jobDetail工作明细来绑定我们的工作,再创建一个触发器来绑定工作明细,再由时间调度说明jobDetail和Tigger的关系

    这是不是属于一个配置啊。那么我们此时不再配置中配置这些信息了,我们创建一个配置类来让这些bean加载到spring容器中。

    //这个类主要是做配置类去配置JobDetail,Trigger即配置工作明细,和触发器,
    @Configuration
    public class QuartzConfig {
    @Bean
        public JobDetail jobDetail(){
            //在这里工作明细要绑定一个job
            //现在这个工作就完成了这里必须要加上storeDurably,这个作用是当这个任务没有被执行也会一直存在保持持久化
    
        return JobBuilder.newJob(Myquartz.class).storeDurably().build();
    
        }
        @Bean
        public Trigger trigger(){
    
        //这里触发器要绑定一个工作明细JobDetail 同时要完成调度
           //这里要说明一下withSchedule是完成调度的下面这行代码是实现时间调度的要
    //要说明一下0 0 0 0 0 0,分别代表 秒 分 时 日 月 星期 其中日 和星期会有冲突通常我们都只配一个 另一个用?代替
            //ScheduleBuilder schdule=CronScheduleBuilder.cronSchedule("0 0 0 0 0 0") ;
            //如CronScheduleBuilder.cronSchedule("0 0 0 1 2 ?")这就代表了2月的第一天0秒0分0时 我们还可以配*代表任意 ;
            //还可以如CronScheduleBuilder.cronSchedule("0/15 * * * * ?")代表没个15秒执行一次
            ScheduleBuilder schdule=CronScheduleBuilder.cronSchedule("0/5 * * * * ?") ;
            //forJob就时绑定工作明细
            return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(schdule).build();
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    这段代码完成后我们就把这些事请都做完了。在这里我要提醒一下特别要注意

    ScheduleBuilder schdule=CronScheduleBuilder.cronSchedule("0/5 * * * * ") ;

    如何对调度进行配置我上面的代码是每个间隔十五秒执行一次在任意时刻。在上面代码块中有我对这部分有对应的解释。

    下面就是开启引导类做一下测试就ok了

    下面我们来讲解第三种完成定时任务的技术

    其实在springboot中,已经为我们提供了一个完成定时任务的技术。SpringTask这个技术。

    它比起Quarze更加的方便。可以使用注解的方式进行。

    和Quarze整合一样我们先导入springtask的坐标依赖,但由于这个技术是spring提供的我们不用导入就有这个功能

    我们要做的是进行配置

    # 配置springtask 定时任务相关的配置
    
    spring:
      task:
        scheduling:
          pool:
            size: 10
          thread-name-prefix: hanhan
        execution:
          shutdown:
    #        线程关闭时是否等所有任务结束
            await-termination: false
    #        线程最大的等待时间,防止线程陷入循环关不掉
            await-termination-period: 10s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    对于 thread-name-prefix 这个配置其实就是给你的任务加个前缀便于区分。和你使用线程一样。

    size就是规定线程池的大小。 await-termination: 就是当你将线程关闭时还有任务没有完成是否等待它完成后关闭 await-termination-period: 就是为了防止你的任务是个无限执行的任务,设置一个最大等待时间。

    下面要做的事情就是开启我们定时任务的功能。

    首先在引导类上使用**@EnableScheduling**注解开启定时任务

    @SpringBootApplication
    @EnableScheduling //这个注解的作用就是开启定时任务功能 利用springtask即时spring的自己的技术
    public class Springbooot2TaskApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(Springbooot2TaskApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在然后我们只要在你要执行的任务上使用**@Scheduled**代表这是一个定时任务

    @Component
    public class SpringTaskJob {
        @Scheduled(cron ="0/1 * * * * ?")
        public void task(){
    
            System.out.println(Thread.currentThread().getName()+"韩波hhh");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    同时在注解中定义调度。和Quarze一样需要配置调度。但是这里是不是比Quarze简单许多

    到这里我们使用springtask完成一个定时任务已经完成。

    这里出现的同时还有我刚刚使用Quarze技术完成的定时任务

    好了这里我们springboot三种完成定时任务的方法已经完成

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    【006身高绝对值排序(C++)】
    【外汇天眼】解析外汇交易平台:深度了解DD与NDD两大模式
    Observability:从零开始创建 Java 微服务并监控它 (二)
    会议管理系统SSM记录(二)
    C++ 多态:(使用Shape类层次结构的多态性的屏幕管理器)开发一个基本图形软件包
    媒体服务器与视频服务器有什么区别
    既生瑜,何生亮?
    基于人工蜂群算法优化的lssvm回归预测-附代码
    MATLAB|不给糖果就捣蛋
    【无线传感器】使用 Mamdani 模糊推理系统改进无线传感器网络路由和数据包传递(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/m0_67401761/article/details/126114619