SpringBoot异步任务实现下单校验库存的项目实践

 更新时间:2023年09月27日 09:54:38   作者:DaenCode  
在开发中,异步任务应用的场景非常的广泛,本文主要介绍了SpringBoot异步任务实现下单校验库存的项目实践,具有一定的参考价值,感兴趣的可以了解一下

🌟前言

在开发中,异步任务应用的场景非常的广泛,本文章以下单时校验库存为例来看看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
@EnableAsync
public class RedisApplication {
	public static void main(String[] args) {
		SpringApplication.run(RedisApplication.class, args);
	}
}

异步任务方法

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

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

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

@Component
public class ValidateTask {
    @Autowired
    private ProductMapper productMapper;
    //校验库存功能
    @Async
    public Future<Boolean> validateStock(int productId, int quantity){
        //查询数据库中的商品
        Product product=productMapper.selectProductById(productId);
        //商品库存校验
        if (product==null || product.getStock()<quantity){
            return new AsyncResult<>(false);
        }else {
            //模拟下单操作
            product.setStock(product.getStock()-quantity);
            //这里就演示订单表保存数据了,直接更新库存
            productMapper.updateProduct(product);
            return new AsyncResult<>(true);
        }
    }
}

Controller层

方法逻辑

  • 调用异步任务。
  • 设置flag标记。
  • 判断异步任务是否完成。
  • 如果flag为true,则下单成功,否则失败。
@RestController
@RequestMapping("/api/v1/product")
public class ProductController {
    @Autowired
    private ValidateTask validateTask;
	//productId-商品id,quantity-购买数量
    @RequestMapping("order")
    public JsonData order(@RequestParam int productId,@RequestParam int quantity) throws ExecutionException, InterruptedException {
    	//调用异步任务
        Future<Boolean> validateResult=validateTask.validateStock(productId,quantity);
        Boolean flag=false;
        //判断异步任务是否完成
        if (validateResult.isDone()){
            try {
                flag=validateResult.get();
            } catch (Exception e) {
                flag=false;
            }
        }
        if (flag){
            return JsonData.buildSuccess("下单成功");
        }else {
            return JsonData.buildError("下单失败,库存不足");
        }
    }

ProductMapper.xml

<mapper namespace="com.shoanjen.redis.mapper.ProductMapper">
   <select id="selectProductById" resultType="com.shoanjen.redis.model.Product">
       select * from product where id=#{productId}
   </select>
    <update id="updateProduct" parameterType="com.shoanjen.redis.model.Product">
        update product set name=#{product.name},price=#{product.price},stock=#{product.stock} where id=#{product.id}
    </update>
</mapper>

效果测试

在这里插入图片描述

下单成功测试

在这里插入图片描述

库存不足测试

在这里插入图片描述

🌟写在最后

有关于SpringBoot异步任务实现下单校验库存的实战到此就结束了,更多相关SpringBoot 下单校验库存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中@Scheduled和HttpClient的连环坑

    Spring中@Scheduled和HttpClient的连环坑

    这篇文章主要给大家介绍了关于Spring中@Scheduled和HttpClient的连环坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • SpringBoot如何防止XSS注入攻击详解

    SpringBoot如何防止XSS注入攻击详解

    这篇文章主要给大家介绍了关于SpringBoot如何防止XSS注入攻击的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java虚拟机之类加载

    Java虚拟机之类加载

    这篇文章主要介绍了Java虚拟机之类加载,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java+mysql用户注册登录功能

    Java+mysql用户注册登录功能

    这篇文章主要为大家详细介绍了Java结合mysql实现用户注册登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java 使用 Graphql 搭建查询服务详解

    Java 使用 Graphql 搭建查询服务详解

    这篇文章主要介绍了Java 使用 Graphql 搭建查询服务详解的相关资料,需要的朋友可以参考下
    2016-12-12
  • Java设计模式之原型设计示例详解

    Java设计模式之原型设计示例详解

    这篇文章主要为大家详细介绍了Java的原型设计模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    IDEA中Mybatis的MGB使用逆向工程配置的详细教程

    这篇文章主要介绍了IDEA中Mybatis的MGB使用逆向工程配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot的WebSocket实现单聊群聊

    SpringBoot的WebSocket实现单聊群聊

    这篇文章主要为大家详细介绍了SpringBoot的WebSocket实现单聊群聊,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • 一篇文章带你玩转Spring bean的终极利器

    一篇文章带你玩转Spring bean的终极利器

    这篇文章主要给大家介绍了关于玩转Spring bean的终极利器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring bean具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Guava Retryer实现接口重试的示例

    Guava Retryer实现接口重试的示例

    本文主要介绍了Guava Retryer实现接口重试的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论