美文网首页
Spring boot+ scheduled定时任务及多任务并发

Spring boot+ scheduled定时任务及多任务并发

作者: JuneGe2017 | 来源:发表于2019-04-25 14:17 被阅读0次

    刚刚看了下Spring Boot实现定时任务的文章,感觉还不错。Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下

    开启scheduler支持

    @SpringBootApplication
    @EnableScheduling
    public class Application{
        public static void mian(String[] args){
            SpringApplication.run(Application.class,args);
        }
    }
    

    编写定时任务

    第一种 定时执行

    @Component
    public class ScheduledTask {
    
        @Scheduled(cron = "*/5 * * * * ?")
        public void task1() throws InterruptedException {
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    任务一启动");
            Thread.sleep(10000);//任务耗时10秒
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    结束");
    
        }
    
        @Scheduled(cron = "*/5 * * * * ?")
        public void task2() throws InterruptedException {
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    任务二启动");
            Thread.sleep(10000);
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "    " + Thread.currentThread().getName() + "    结束");
        }
    }
    
    #运行结果
    2019-04-25 11:27:40    pool-1-thread-1    任务一启动
    2019-04-25 11:27:50    pool-1-thread-1    任务一结束
    2019-04-25 11:27:50    pool-1-thread-1    任务二启动
    2019-04-25 11:28:00    pool-1-thread-1    任务二结束
    2019-04-25 11:28:00    pool-1-thread-1    任务一启动
    2019-04-25 11:28:10    pool-1-thread-1    任务一结束
    2019-04-25 11:28:10    pool-1-thread-1    任务二启动
    

    cron可以参考[cron参数详解]
    (https://www.jianshu.com/p/09150a256269)

    通过运行结果可以发现,任务一和任务二是线性依次执行的,所有的任务都是在同一个线程池中的同一个线程来完成的

    第二种 间隔执行

    //每个5000毫秒执行一次
    @Scheduled(fixedRate = 5000)
        public void reportCurrentTime() {
            System.out.println("每隔五秒钟执行一次: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        }
    

    任务并发执行配置

    那么,怎么设计成多线程实现并发呢?在网上看到过这样的解决方案。通过ScheduleConfig配置文件实现SchedulingConfigurer接口,并重写setScheduler方法

    @Component
    public class ScheduledConfig implements SchedulingConfigurer {
        
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            taskRegistrar.setScheduler(TaskScheduler());
        }
        
        @Bean(destroyMethod = "shutdown")
        public Executor TaskScheduler() {
            return Executors.newScheduledThreadPool(10);
        }
    }
    
    2019-04-25 14:10:20    pool-2-thread-2    任务二启动
    2019-04-25 14:10:20    pool-2-thread-1    任务一启动
    2019-04-25 14:10:30    pool-2-thread-2    任务二结束
    2019-04-25 14:10:30    pool-2-thread-1    任务一结束
    2019-04-25 14:10:35    pool-2-thread-1    任务一启动
    2019-04-25 14:10:35    pool-2-thread-2    任务二启动
    

    通过运行结果可以看出,两个任务可以同时执行,同一个任务不会并发执行(对于同一个任务,上一个执行完后,再进行下一次任务,可以看出两个任务都是过了10秒执行完后,等待5秒再次执行,而不是固定的5秒一次)

    对于同一个任务也想要并发执行可以加上@Async注解,思路就是使任务执行也是异步即可

    相关文章

      网友评论

          本文标题:Spring boot+ scheduled定时任务及多任务并发

          本文链接:https://www.haomeiwen.com/subject/nkdagqtx.html