SpringBoot整合定时任务和异步任务(SpringBoot 系列-五)

SpringBoot整合定时任务和异步任务

一、SpringBoot定时任务schedule概述

定时任务方案:

1.Java自带的java.util.Timer类

  • timer:配置比较麻烦,时间延后问题
  • timertask:不推荐

2、Quartz框架

  • 配置更简单
  • xml或者注解

3、SpringBoot使用注解方式开启定时任务

  • 启动类里面 @EnableScheduling开启定时任务,自动扫描
  • 定时任务业务类 加注解 @Component被容器扫描
  • 定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次

二、SpringBoot常用定时任务配置

1、cron 定时任务表达式 :

@Scheduled(cron="*/1 * * * * *") 表示每秒执行一次

crontab 工具 https://tool.lu/crontab/

Java(Spring)
*    *    *    *    *    *    *
-    -    -    -    -    -    -
|    |    |    |    |    |    |
|    |    |    |    |    |    + year [optional]
|    |    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7)
|    |    |    |    +---------- month (1 - 12)
|    |    |    +--------------- day of month (1 - 31)
|    |    +-------------------- hour (0 - 23)
|    +------------------------- min (0 - 59)
+------------------------------ second (0 - 59)

几个例子:

0 0 3 * * ?     每天3点执行
0 5 3 * * ?     每天3点5分执行
0 5 3 ? * *     每天3点5分执行,与上面作用相同
0 5/10 3 * * ?  每天3点的 5分,15分,25分,35分,45分,55分这几个时间点执行
0 10 3 ? * 1    每周星期天,3点10分 执行,注:1表示星期天    
0 10 3 ? * 1#3  每个月的第三个星期,星期天 执行,#号只能出现在星期的位置

2、fixedRate: 定时多久执行一次(上一次开始执行时间点后xx秒再次执行)

3、fixedDelay: 上一次执行结束时间点后xx秒再次执行

4、fixedDelayString: 字符串形式,可以通过配置文件指定

三、SpringBoot2.x异步任务

1、什么是异步任务和使用场景:适用于处理log、发送邮件、短信……等

下单接口->查库存 100ms
        余额校验 150ms
        风控用户 100ms
        ....

2、启动类里面使用@EnableAsync注解开启功能,自动扫描

3、定义异步任务类并使用@Component标记组件被容器扫描,异步方法加上@Async

注意点:
>
- 要把异步任务封装到类里面,不能直接写到Controller
- 增加Future 并返回结果 AsyncResult("task执行完成");
- 如果需要拿到结果 需要判断全部的 task.isDone()

4、通过注入方式,注入到controller里面,如果测试前后区别则改为同步则把Async注释掉


附:Future简单介绍

1.Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。

2.Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。

3.Future接口是一个泛型接口,严格的格式应该是Future,其中V代表了Future执行的任务返回值的类型。 Future接口的方法介绍如下:

  • boolean cancel (boolean mayInterruptIfRunning)
    取消任务的执行。参数指定是否立即中断任务执行,或者等等任务结束
  • boolean isCancelled ()
    任务是否已经取消,任务正常完成前将其取消,则返回 true
  • boolean isDone ()
    任务是否已经完成。需要注意的是如果任务正常终止、异常或取消,都将返回true
  • V get () throws InterruptedException, ExecutionException
    等待任务执行结束,然后获得V类型的结果。InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException
  • V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
    同上面的get功能一样,多了设置超时时间。参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计算超时,将抛出TimeoutException

关于future的一些描述:

  • Future是一个接口,FutureTask是Future的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。所以可以通过Excutor(线程池)来执行,也可传递给Thread对象执行。
  • 如果在主线程中需要执行比较耗时的操作,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。
  • FutureTask是为了弥补Thread的不足而设计的,它可以让程序员准确地知道线程什么时候执行完成并获得到线程执行完成后返回的结果(如果有需要)
  • FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。
  • Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

你可能感兴趣的:(java)