欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

??前言

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

??思維導圖

在這里插入圖片描述

??流程圖

在這里插入圖片描述

??必不可少的注解

  • @EnableAsync:用于標識啟動類,開啟異步任務。
  • @Component:標識異步任務類。
  • @Async:標識定時任務方法。

??獲取異步結果的API

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

??實現(xiàn)步驟

數(shù)據(jù)準備

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

啟動類開啟異步任務

添加@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注解。
方法邏輯

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

優(yōu)點:通過異步任務實現(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層

方法邏輯

  • 調用異步任務。
  • 設置flag標記。
  • 判斷異步任務是否完成。
  • 如果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 {
    	//調用異步任務
        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異步任務實現(xiàn)下單校驗庫存的實戰(zhàn)到此就結束了,更多相關SpringBoot 下單校驗庫存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Dubbo在Spring和Spring Boot中的使用詳解

    Dubbo在Spring和Spring Boot中的使用詳解

    這篇文章主要介紹了Dubbo在Spring和Spring Boot中的使用詳解,需要的朋友可以參考下
    2017-10-10
  • IntelliJ IDEA 2020安裝使用教程詳解

    IntelliJ IDEA 2020安裝使用教程詳解

    這篇文章主要介紹了IntelliJ IDEA 2020安裝使用教程,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • js判斷是否是移動設備登陸網(wǎng)頁的簡單方法

    js判斷是否是移動設備登陸網(wǎng)頁的簡單方法

    這篇文章主要介紹了js判斷是否是移動設備登陸網(wǎng)頁的簡單方法,需要的朋友可以參考下
    2014-02-02
  • Spring Boot優(yōu)化后啟動速度快到飛起技巧示例

    Spring Boot優(yōu)化后啟動速度快到飛起技巧示例

    這篇文章主要為大家介紹了Spring Boot優(yōu)化后啟動速度快到飛起的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Intellij IDEA導入JAVA項目并啟動(圖文教程)

    Intellij IDEA導入JAVA項目并啟動(圖文教程)

    這篇文章主要介紹了Intellij IDEA導入JAVA項目并啟動,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Spring觀察者模式之事件發(fā)布訂閱實現(xiàn)和源碼詳解

    Spring觀察者模式之事件發(fā)布訂閱實現(xiàn)和源碼詳解

    這篇文章主要介紹了Spring觀察者模式之事件發(fā)布訂閱實現(xiàn)和源碼詳解,Spring認為發(fā)布訂閱主題,其實可以理解為事件驅動的編碼,先來實現(xiàn)以下Spring容器中的事件發(fā)布訂閱,需要的朋友可以參考下
    2024-01-01
  • springboot注冊bean的三種方法

    springboot注冊bean的三種方法

    這篇文章主要介紹了springboot注冊bean的三種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • SpringAOP核心對象的創(chuàng)建圖解

    SpringAOP核心對象的創(chuàng)建圖解

    這篇文章主要介紹了SpringAOP核心對象的創(chuàng)建詳解,通過使用AOP,我們可以將橫切關注點(如日志記錄、性能監(jiān)控、事務管理等)從業(yè)務邏輯中分離出來,使得代碼更加模塊化、可維護性更高,需要的朋友可以參考下
    2023-10-10
  • 實例詳解java Struts2的配置與簡單案例

    實例詳解java Struts2的配置與簡單案例

    這篇文章主要介紹了java Struts2的配置與簡單案例,需要的朋友可以參考下
    2017-04-04
  • springboot整合shiro的過程詳解

    springboot整合shiro的過程詳解

    Shiro 是一個強大的簡單易用的 Java 安全框架,主要用來更便捷的 認證,授權,加密,會話管理,這篇文章給大家詳細介紹Shiro 工作原理及架構圖,通過實例圖文相結合給大家介紹的非常詳細,需要的朋友參考下吧
    2021-10-10

最新評論