最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot異步任務(wù)實現(xiàn)下單校驗庫存的項目實踐

 更新時間:2023年09月27日 09:54:38   作者:DaenCode  
在開發(fā)中,異步任務(wù)應(yīng)用的場景非常的廣泛,本文主要介紹了SpringBoot異步任務(wù)實現(xiàn)下單校驗庫存的項目實踐,具有一定的參考價值,感興趣的可以了解一下

??前言

在開發(fā)中,異步任務(wù)應(yīng)用的場景非常的廣泛,本文章以下單時校驗庫存為例來看看SpringBoot中異步任務(wù)的使用。使用異步任務(wù)可以提高系統(tǒng)的響應(yīng)性能,提高系統(tǒng)的并發(fā)能力,改善用戶體驗,減少資源的浪費,提高系統(tǒng)的可擴展性。

??思維導(dǎo)圖

在這里插入圖片描述

??流程圖

在這里插入圖片描述

??必不可少的注解

  • @EnableAsync:用于標(biāo)識啟動類,開啟異步任務(wù)。
  • @Component:標(biāo)識異步任務(wù)類。
  • @Async:標(biāo)識定時任務(wù)方法。

??獲取異步結(jié)果的API

方法描述
boolean cancel(boolean mayInterruptIfRunning)取消異步任務(wù)的執(zhí)行。
boolean isCancelled()判斷異步任務(wù)是否被取消。
boolean isDone()判斷異步任務(wù)是否已經(jīng)完成。
V get() throws InterruptedException, ExecutionException獲取異步任務(wù)的結(jié)果。
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException在指定的時間內(nèi)獲取異步任務(wù)的結(jié)果。如果超時,會拋出TimeoutException。

??實現(xiàn)步驟

數(shù)據(jù)準(zhǔn)備

創(chuàng)建數(shù)據(jù)庫表,并插入示例數(shù)據(jù)

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;
}

啟動類開啟異步任務(wù)

添加@EnableAsync開啟異步任務(wù)。

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

異步任務(wù)方法

在異步任務(wù)方法上添加@Async注解。
方法邏輯

  • 根據(jù)商品id查詢數(shù)據(jù)庫是否存在當(dāng)前商品
  • 若商品不存在、或者商品當(dāng)前庫存小于購買量quantity,返回false。
  • 若商品存在,進行模擬下單操作。更新庫存的數(shù)量。
  • 當(dāng)然還有查詢余額的邏輯,我這里沒有寫,跟查詢庫存類似。

優(yōu)點:通過異步任務(wù)實現(xiàn)下單時查詢庫存以及余額,可以很大的提高性能。

@Component
public class ValidateTask {
    @Autowired
    private ProductMapper productMapper;
    //校驗庫存功能
    @Async
    public Future<Boolean> validateStock(int productId, int quantity){
        //查詢數(shù)據(jù)庫中的商品
        Product product=productMapper.selectProductById(productId);
        //商品庫存校驗
        if (product==null || product.getStock()<quantity){
            return new AsyncResult<>(false);
        }else {
            //模擬下單操作
            product.setStock(product.getStock()-quantity);
            //這里就演示訂單表保存數(shù)據(jù)了,直接更新庫存
            productMapper.updateProduct(product);
            return new AsyncResult<>(true);
        }
    }
}

Controller層

方法邏輯

  • 調(diào)用異步任務(wù)。
  • 設(shè)置flag標(biāo)記。
  • 判斷異步任務(wù)是否完成。
  • 如果flag為true,則下單成功,否則失敗。
@RestController
@RequestMapping("/api/v1/product")
public class ProductController {
    @Autowired
    private ValidateTask validateTask;
	//productId-商品id,quantity-購買數(shù)量
    @RequestMapping("order")
    public JsonData order(@RequestParam int productId,@RequestParam int quantity) throws ExecutionException, InterruptedException {
    	//調(diào)用異步任務(wù)
        Future<Boolean> validateResult=validateTask.validateStock(productId,quantity);
        Boolean flag=false;
        //判斷異步任務(wù)是否完成
        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>

效果測試

在這里插入圖片描述

下單成功測試

在這里插入圖片描述

庫存不足測試

在這里插入圖片描述

??寫在最后

有關(guān)于SpringBoot異步任務(wù)實現(xiàn)下單校驗庫存的實戰(zhàn)到此就結(jié)束了,更多相關(guān)SpringBoot 下單校驗庫存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的finally塊居然沒執(zhí)行的6種問題解決

    Java的finally塊居然沒執(zhí)行的6種問題解決

    本文探討了Java中try-catch-finally結(jié)構(gòu)下finally塊可能不執(zhí)行的情況,并分析了JVM層面的原理,文章列出了6種特殊情況,下面就來詳細的介紹一下
    2026-05-05
  • spring?boot只需兩步優(yōu)雅整合activiti示例解析

    spring?boot只需兩步優(yōu)雅整合activiti示例解析

    這篇文章主要主要來教大家spring?boot優(yōu)雅整合activiti只需兩步就可完成測操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2022-03-03
  • IntelliJ IDEA 2020.2 配置大全詳細圖文教程(更新中)

    IntelliJ IDEA 2020.2 配置大全詳細圖文教程(更新中)

    這篇文章主要介紹了IntelliJ IDEA 2020.2 配置大全(更新中),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Docker搭建前端Java的開發(fā)環(huán)境詳解

    Docker搭建前端Java的開發(fā)環(huán)境詳解

    相信每個人入職第一天就是搭建本地開發(fā)環(huán)境,因為我司用的是java,看見了多年不見的eclipse的圖標(biāo)出現(xiàn)我的電腦上,我是難過的。后來知道并不是我一個人有此感受。這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,詳細的給大家介紹了利用Docker搭建前端Java的開發(fā)環(huán)境。
    2016-10-10
  • java實現(xiàn)模擬USB接口的功能

    java實現(xiàn)模擬USB接口的功能

    本文主要介紹了java實現(xiàn)模擬USB接口的功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java斷點續(xù)傳(文件分塊)完整實現(xiàn)步驟

    Java斷點續(xù)傳(文件分塊)完整實現(xiàn)步驟

    這篇文章主要介紹了Java斷點續(xù)傳(文件分塊)完整實現(xiàn)步驟,?斷點續(xù)傳通過分塊傳輸大文件,中斷后可續(xù)傳未完成部分,服務(wù)端合并分塊,避免重復(fù)上傳,提升用戶體驗并節(jié)省網(wǎng)絡(luò)資源,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-05-05
  • Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能

    Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能

    這篇文章主要介紹了Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個線程池的配置,讓Spring Boot加載,用來定義如何創(chuàng)建一個ThreadPoolTaskExecutor,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-08-08
  • IDEA 2020 2全家桶安裝激活超詳細圖文教程

    IDEA 2020 2全家桶安裝激活超詳細圖文教程

    這篇文章主要介紹了IDEA-2020-2 全家桶安裝激活超詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot中的ImportSelector類動態(tài)加載bean詳解

    SpringBoot中的ImportSelector類動態(tài)加載bean詳解

    這篇文章主要介紹了SpringBoot中的ImportSelector類動態(tài)加載bean詳解,ImportSelector接口是spring中導(dǎo)入外部配置的核心接口,根據(jù)給定的條件(通常是一個或多個注釋屬性)判定要導(dǎo)入那個配置類,在spring自動化配置和@EnableXXX中都有它的存在,需要的朋友可以參考下
    2024-01-01
  • 解讀Java報錯輸出的信息究竟是什么

    解讀Java報錯輸出的信息究竟是什么

    Java報錯輸出的信息主要包括異常的主要描述信息和當(dāng)前線程的棧幀信息,棧幀是虛擬機棧的基本存儲單元,主要由局部變量表、操作數(shù)棧和幀數(shù)據(jù)三部分組成,局部變量表用于存放方法的參數(shù)和局部變量,操作數(shù)棧用于保存計算過程中產(chǎn)生的中間結(jié)果
    2024-12-12

最新評論

巧家县| 新巴尔虎右旗| 射洪县| 布拖县| 孟连| 江源县| 通辽市| 平顺县| 五家渠市| 通化县| 读书| 伊宁县| 武定县| 黑水县| 揭阳市| 嘉定区| 麻阳| 濉溪县| 金平| 湟中县| 惠水县| 平武县| 辽阳县| 萨迦县| 宜阳县| 巴林右旗| 米脂县| 揭西县| 南皮县| 化州市| 车致| 海阳市| 麦盖提县| 廉江市| 太保市| 博兴县| 个旧市| 阿尔山市| 普格县| 永清县| 肥东县|