zoukankan      html  css  js  c++  java
  • SpringBoot自带的定时功能

    一、实现步骤

    备注:本文介绍的方法可以动态修改执行周期,其实就是通过修改cron值达到修改执行周期,修改cron的值的方法看具体使用情况。

    ① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
    ② 设置一个静态的cron,用于存放任务执行周期参数。(本文介绍的方法可以动态修改执行周期)

    二、实现代码示例

    代码中向控制台打印的部分,即是需要重复执行的片段

     1、无需修改执行周期用:第一种

    @Component
    @EnableScheduling //①步                ①步
    public class TaskCronChangeController implements SchedulingConfigurer{
    
        public static String cron;  //②    
        //核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,
        //一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期
        @Override
        public void configureTasks(ScheduledTaskRegistrar arg0) {
    //秒,分钟,小时,日期,月份,星期,年 (相 对应) cron
    ="0/70 * * * * *";//间隔70秒触发一次 ,这个是固定死的, Runnable task = new Runnable() { //重复运行代码片段 @Override public void run() { //ApiController api = new ApiController(); //System.out.println(api.getdas()); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("I am going:" + LocalDateTime.now()); System.out.println("I am going:" + df.format(System.currentTimeMillis())); } }; Trigger trigger = new Trigger() { @Override public Date nextExecutionTime(TriggerContext arg1) { //任务触发,可修改任务的执行周期. //每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间 //corn可以在这里再次获取,但是要在下下次才能生效 CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(arg1); return nextExec; }}; arg0.addTriggerTask(task, trigger); } }

    2、需要修改执行周期:第二种

    去这里看7分钟的视频讲解吧:https://v.youku.com/v_show/id_XMjY5NDg2OTA0MA==.html

    注意红色部分,我是通过接口去实现改变的,方法很多,关键是如何取到cron的值,去访问数据库取也可以。

    @RestController
    @EnableScheduling
    public class TaskCronChangeCtr implements SchedulingConfigurer{
    
        public String cron="0/25 * * * * *";
        
        @RequestMapping("/ChangCron")
        public String ChangCron(@RequestBody String param,HttpServletRequest request,HttpServletResponse response) throws IOException{
            response.setContentType("text/html;charset=utf-8");
            System.out.println(param);
            JSONObject json = JSONObject.fromObject(param);    
            cron=String.valueOf(json.get("cron"));
            //cron="0/10 * * * * *";//修改为10秒一次
            //response.getWriter().write("修改成功");
            return "修改成功";
        }
        
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            
            //秒,分钟,小时,日期,月份,星期,年 (相 对应)
    //    cron="0/70 * * * * *";//间隔70秒触发一次
        
        Runnable  task = new Runnable() {
            //重复运行代码片段
            @Override
            public void run() {
                //ApiController api = new ApiController();
                //System.out.println(api.getdas());
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println("I am going:" + LocalDateTime.now());
                System.out.println("I am going:" + df.format(System.currentTimeMillis()));
    
            }
        
         };
        Trigger trigger = new Trigger() {
        @Override
        public Date nextExecutionTime(TriggerContext arg1) {
            //任务触发,可修改任务的执行周期.
            //每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间 
            //corn可以在这里再次获取,但是要在下下次才能生效
            CronTrigger trigger = new CronTrigger(cron);
            Date nextExec = trigger.nextExecutionTime(arg1);
            return nextExec;
    
        }};
        taskRegistrar.addTriggerTask(task, trigger);
        }
    
    }
  • 相关阅读:
    [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞) HEOI
    关于微服务网关
    管理 API 时要问的关键问题
    如何构建成功的微服务架构
    后端老是不写接口文档?说自己很忙?
    Nginx配置文件详解
    Keepalived 高可用
    Jenkins 调用 Shell 脚本
    Supervisor
    Harbor高可用实现基于haproxy
  • 原文地址:https://www.cnblogs.com/puzhichao/p/12158797.html
Copyright © 2011-2022 走看看