您的当前位置:首页正文

SpringBoot2.x+Spring5+Mybits3.x后期使用vue前端构建前后端分离-13 定时任务和异步任务

2024-11-30 来源:个人技术集锦

什么是定时任务和常见定时任务区别

什么是定时任务,使用场景

  • 某个时间定时处理某个任务
  • 发邮件、短信等
  • 消息提醒
  • 订单通知
  • 统计报表系统 --每天的访问的量订单等
  • ....

常见定时任务

  • Java自带的java.util.Timer类配置比较麻烦,时间延后问题
  • Quartz框架: 配置更简单,xml或者注解适合分布式或者大型调度作业
  • SpringBoot框架自带

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

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

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @Program: demo-project1
 * @Description: 定时统计订单,金额
 * @Author: chen
 * @Dates: 2020-11-09-20-06
 * @Version:
 **/
@Component
public class VideoOrderTask {

//    @Scheduled(fixedRate = 2000)//任务不管是否结束都执行
//    @Scheduled(fixedDelay = 2000)//任务结束之后执行
    @Scheduled(cron="*/1 * * * * *")//个性化定时
    public void sum(){
//        System.out.println(LocalDateTime.now() +"当前交易额="+Math.random());
    }
}
package work.flyrun.demoproject1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@ServletComponentScan
@SpringBootApplication
@EnableScheduling
public class DemoProject1Application {

	public static void main(String[] args) {
		SpringApplication.run(DemoProject1Application.class, args);
	}

}

springboot2.x异步任务EnableAsync

什么是异步任务和使用场景:适用于处理log、发送邮件、短信……等(减少用户的等待时间 相当于线程)

  • 下单接口->查库存 1000
  • 余额校验 1500
  • 风控用户1000

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

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

使用SpringBoot2.x开发异步任务Future获取结果

定义异步任务类需要获取结果

  • 注意点:

    • 要把异步任务封装到类里面,不能直接写到Controller
    • 增加Future 返回结果 AsyncResult("task执行完成");
    • 如果需要拿到结果 需要判断全部的 task.isDone()
 @Autowired
    private AsyncTask asyncTask;

    @GetMapping("async")
    public JsonData testAsync(){
        long begin  = System.currentTimeMillis();
//        asyncTask.task1();
//        asyncTask.task2();

        Future<String> task4 = asyncTask.task4();
        Future<String> task5 = asyncTask.task5();
        for (;;){
            if (task4.isDone() && task5.isDone()){
                try {
                    String task4Result=task4.get();//自行定义一个线程睡眠模拟效果
                    System.out.println(task4Result);
                    String task5Result=task5.get();
                    System.out.println(task5Result);
                }catch (ExecutionException e){//试图获取已通过抛出异常而中止的任务的结果时
                    e.printStackTrace();
                }catch (InterruptedException e){//当在sleep中的线程被调用interrupt方法时,就会放弃暂停的状态
                    e.printStackTrace();
                }
                finally {
                    break;

                }
            }
        }

        long end = System.currentTimeMillis();
        return JsonData.buildSuccess(end-begin);
    }

下一章介绍在线视频中所用到的数据库结构

显示全文