好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

SpringBoot三种方式实现定时任务

定时任务实现的三种方式

Timer :这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。 ScheduledExecutorService :也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。 Spring Task :Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

使用Timer

这个目前在项目中用的较少,直接贴demo代码。具体的介绍可以查看api

?

1

2

3

4

5

6

7

8

9

10

11

12

13

public class TestTimer {

     public static void main(String[] args) {

         TimerTask timerTask = new TimerTask() {

             @Override

             public void run() {

                 System.out.println( "task  run:" + new Date());

             }

         };

         Timer timer = new Timer();

         //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次

         timer.schedule(timerTask, 10 , 3000 );

     }

}

使用ScheduledExecutorService

该方法跟Timer类似,直接看demo:

?

1

2

3

4

5

6

7

8

public class TestScheduledExecutorService {

     public static void main(String[] args) {

         ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

         // 参数:1、任务体 2、首次执行的延时时间

         //      3、任务执行间隔 4、间隔时间单位

         service.scheduleAtFixedRate(()->System.out.println( "task ScheduledExecutorService " + new Date()), 0 , 3 , TimeUnit.SECONDS);

     }

}

使用Spring Task

1.简单的定时任务

在SpringBoot项目中,我们可以很优雅的使用注解来实现定时任务,首先创建项目,导入依赖:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

< dependencies >

   < dependency >

     < groupId >org.springframework.boot</ groupId >

     < artifactId >spring-boot-starter-web</ artifactId >

   </ dependency >

   < dependency >

     < groupId >org.springframework.boot</ groupId >

     < artifactId >spring-boot-starter</ artifactId >

   </ dependency >

   < dependency >

     < groupId >org.projectlombok</ groupId >

     < artifactId >lombok</ artifactId >

     < optional >true</ optional >

   </ dependency >

   < dependency >

     < groupId >org.springframework.boot</ groupId >

     < artifactId >spring-boot-starter-test</ artifactId >

     < scope >test</ scope >

   </ dependency >

</ dependencies >

创建任务类:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@Slf4j

@Component

public class ScheduledService {

     @Scheduled (cron = "0/5 * * * * *" )

     public void scheduled(){

         log.info( "=====>>>>>使用cron  {}" ,System.currentTimeMillis());

     }

     @Scheduled (fixedRate = 5000 )

     public void scheduled1() {

         log.info( "=====>>>>>使用fixedRate{}" , System.currentTimeMillis());

     }

     @Scheduled (fixedDelay = 5000 )

     public void scheduled2() {

         log.info( "=====>>>>>fixedDelay{}" ,System.currentTimeMillis());

     }

}

在主类上使用@EnableScheduling注解开启对定时任务的支持,然后启动项目

可以看到三个定时任务都已经执行,并且使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。

2.多线程执行

在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@Configuration

@EnableAsync

public class AsyncConfig {

      /*

     此处成员变量应该使用@Value从配置中读取

      */

     private int corePoolSize = 10 ;

     private int maxPoolSize = 200 ;

     private int queueCapacity = 10 ;

     @Bean

     public Executor taskExecutor() {

         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

         executor.setCorePoolSize(corePoolSize);

         executor.setMaxPoolSize(maxPoolSize);

         executor.setQueueCapacity(queueCapacity);

         executor.initialize();

         return executor;

     }

}

@Configuration :表明该类是一个配置类 @EnableAsync :开启异步事件的支持

然后在定时任务的类或者方法上添加@Async 。最后重启项目,每一个任务都是在不同的线程中。

在线cron表达式生成:http://qqe2.com/cron/index

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/longzhongxiaoniao/article/details/86182075

查看更多关于SpringBoot实现定时任务的三种方式小结的详细内容...

  阅读:11次