一张思维导图学会使用SpringBoot异步任务实现下单校验库存
🧑💻作者名称: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异步任务实现下单校验库存的实战到此就结束了,希望此文能够帮助正在学习的你们。如有错误或者补充请在评论区留言,谢谢大家!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbgkgg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01