小工具知识网

当前位置: 首页 > 行业知识 > 一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存

行业知识

一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存

2026-11-12 19:53:43 来源:互联网转载

‍作者名称:DaenCode

作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。

人生感悟:尝尽人生百味,方知世间冷暖。

所属专栏:SpringBoot实战

系列文章目录

标题
一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码)
一张思维导图带你学会Springboot创建全局异常、自定义异常
一张思维导图带你打通SpringBoot自定义拦截器的思路
28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件


文章目录

  • 系列文章目录
  • 前言
  • 思维导图
  • 流程图
  • 必不可少的注解
  • 获取异步结果的API
  • 实现步骤
    • 数据准备
    • 实体类
    • 启动类开启异步任务
    • 异步任务方法
    • Controller层
    • ProductMapper.xml
    • 效果测试
      • 下单成功测试
      • 库存不足测试
      • 写在最后

        前言

        在开发中,异步任务应用的场景非常的广泛,本文章以下单时校验库存为例来看看SpringBoot中异步任务的使用。使用异步任务可以提高系统的响应性能,提高系统的并发能力,改善用户体验,减少资源的浪费,提高系统的可扩展性。

        思维导图

        流程图

        必不可少的注解

        @EnableAsync:用于标识启动类,开启异步任务。

        @Component:标识异步任务类。

        @Async:标识定时任务方法。

        获取异步结果的API

        方法描述
        boolean cancel(boolean mayInterruptIfRunning)取消异步任务的执行。
        boolean isCancelled()判断异步任务是否被取消。
        boolean isDone()判断异步任务是否已经完成。
        V get() throws InterruptedException, ExecutionException获取异步任务的结果。
        V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException在指定的时间内获取异步任务的结果。如果超时,会抛出TimeoutException。

        实现步骤

        数据准备

        创建数据库表,并插入示例数据

        CREATE TABLE product (  id INT PRIMARY KEY,  name VARCHAR(100),  price DECIMAL(10,2),  stock INT);INSERT INTO product (id, name, price, stock) VALUES  (1, '苹果13', 10.99, 50),  (2, '小米10', 19.99, 100),  (3, '华为mate20', 5.99, 20);

        实体类

        public class Product {    private Integer id;    private String name;    private BigDecimal price;    private Integer stock;}

        启动类开启异步任务

        添加@EnableAsync开启异步任务。

        @SpringBootApplication@MapperScan("com.shoanjen.redis.mapper")@EnableCaching@EnableScheduling@EnableAsyncpublic class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}}

        异步任务方法

        在异步任务方法上添加@Async注解。

        方法逻辑:

        • 根据商品id查询数据库是否存在当前商品
        • 若商品不存在、或者商品当前库存小于购买量quantity,返回false。
        • 若商品存在,进行模拟下单操作。更新库存的数量。
        • 当然还有查询余额的逻辑,我这里没有写,跟查询库存类似。

          优点:通过异步任务实现下单时查询库存以及余额,可以很大的提高性能。

          @Componentpublic class ValidateTask {    @Autowired    private ProductMapper productMapper;    //校验库存功能    @Async    public Future validateStock(int productId, int quantity){        //查询数据库中的商品        Product product=productMapper.selectProductById(productId);        //商品库存校验        if (product==null || product.getStock()            return new AsyncResult            //模拟下单操作            product.setStock(product.getStock()-quantity);            //这里就演示订单表保存数据了,直接更新库存            productMapper.updateProduct(product);            return new AsyncResult    @Autowired    private ValidateTask validateTask;//productId-商品id,quantity-购买数量    @RequestMapping("order")    public JsonData order(@RequestParam int productId,@RequestParam int quantity) throws ExecutionException, InterruptedException {    //调用异步任务        Future            try {                flag=validateResult.get();            } catch (Exception e) {                flag=false;            }        }        if (flag){            return JsonData.buildSuccess("下单成功");        }else {            return JsonData.buildError("下单失败,库存不足");        }    }

上一篇:揭秘pyd文件,深度解析与应用指南

下一篇:探索CFG文件,揭开配置与设置的神秘面纱