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

这篇具有很好参考价值的文章主要介绍了一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:SpringBoot实战

系列文章目录

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

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


🌟前言

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

🌟思维导图

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

🌟流程图

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

🌟必不可少的注解

@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 boot,java,spring

下单成功测试

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

库存不足测试

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

🌟写在最后

有关于SpringBoot异步任务实现下单校验库存的实战到此就结束了,希望此文能够帮助正在学习的你们。如有错误或者补充请在评论区留言,谢谢大家!


一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存,SpringBoot实战,spring boot,java,spring文章来源地址https://www.toymoban.com/news/detail-635415.html

到了这里,关于一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一张思维导图带你打通SpringBoot自定义拦截器的思路

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 在开发中,都离不开拦截器的使用。比如说在开发登录功能时,采用JWT登录时通过对token进行验证实现登

    2024年02月14日
    浏览(50)
  • 一张流程图带你学会SpringBoot结合JWT实现登录功能

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 JWT(JsonWebToken)是 一种轻量级的跨域身份验证解决方案 。通常被用于无状态身份验证机制,将用户信息签名

    2024年02月11日
    浏览(80)
  • 一张图带你学会入门级别的SpringBoot实现文件上传、下载功能

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码) 一张思维导图带你学会Springboot创

    2024年02月12日
    浏览(78)
  • java思维导图 - -13张思维导图带你快速入门 --

    java!!!!!!!!! 13张思维导图带你快速入门 --满满干货(建议收藏) –怒肝一周,只求一赞!!! 囊括了java大部分的知识点,今天分享给大家,希望能帮助到各位友友! 分为电脑端和手机端! 手机端隐藏了部分分支,便于观看 电脑端是完整版,根据需求自行选择。

    2024年02月02日
    浏览(69)
  • springboot 与异步任务,定时任务,邮件任务

    在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。 SpringBoot 实现比较简单 主启

    2024年02月10日
    浏览(40)
  • SpringBoot整合、SpringBoot与异步任务

    java 的代码是同步顺序执行,当我们需要执行异步操作时我们通常会去创建一个新线程去执行。比如new Thread()。start(),或者使用线程池线程池 new ThreadPoolExecutor().execute 。 在 Springboot 中对其进行了简化处理,使用@EnableAsync + @Async 可以快速开启一个异步线程执行任务 启动类上使

    2024年02月13日
    浏览(35)
  • SpringBoot 实现异步任务

    在多数的Java项目中,在很多的场景都是用同步的方式去实现模块间的相互调用,在模块调用间可能会造成一些延迟,本篇文章将使用SpringBoot 去实现异步之间的调用, 提高系统的并发性能、用户体验。 简单直观:同步任务的执行是顺序的,代码执行的流程清晰明了,易于理

    2024年02月10日
    浏览(38)
  • SpringBoot 异步、邮件任务

    创建一个Hello项目 创建一个类AsyncService 异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功,所以我们一般会采用多线程的方式去处理这些任务。 编写方法,假装正在处理数据,使用线程

    2024年02月13日
    浏览(47)
  • SpringBoot(十三)异步任务

    目录 异步任务 1.1 什么叫异步 1、Java线程处理 2、SpringBoot异步任务 2.1 使用注解@EnableAsync开启异步任务支持 2.2、使用@Async注解标记要进行异步执行的方法 2.3、controller测试 3、异步任务相关限制 4、自定义 Executor(自定义线程池) 4.1、应用层级: 4.2、方法层级: 有时候,前端

    2024年02月04日
    浏览(34)
  • SpringBoot(19)异步任务

    有时候,前端可能提交了一个耗时任务,如果后端接收到请求后,直接执行该耗时任务,那么前端需要等待很久一段时间才能接受到响应。如果该耗时任务是通过浏览器直接进行请求,那么浏览器页面会一直处于转圈等待状态。 事实上,当后端要处理一个耗时任务时,通常都

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包