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

SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享

 更新時(shí)間:2023年10月06日 08:42:51   作者:一只愛擼貓的程序猿  
在電商和其他涉及到在線支付的應(yīng)用中,通常需要實(shí)現(xiàn)一個(gè)功能:如果用戶在生成訂單后的一定時(shí)間內(nèi)未完成支付,系統(tǒng)將自動(dòng)取消該訂單,本文將詳細(xì)介紹基于Spring Boot框架實(shí)現(xiàn)訂單30分鐘內(nèi)未支付自動(dòng)取消的幾種方案,并提供實(shí)例代碼,需要的朋友可以參考下

方案一:定時(shí)任務(wù)

利用Spring Boot中的@Scheduled注解,我們可以輕松地實(shí)現(xiàn)定時(shí)任務(wù)。該任務(wù)將周期性地掃描數(shù)據(jù)庫(kù),檢查未支付的訂單,如果訂單生成30分鐘未支付,則自動(dòng)取消。

@Component
public class OrderCancelSchedule {
    @Autowired
    private OrderService orderService;
    @Scheduled(cron = "0 0/1 * * * ?")
    public void cancelUnpaidOrders() {
        List<Order> unpaidOrders = orderService.getUnpaidOrders();
        unpaidOrders.forEach(order -> {
            if (order.getCreationTime().plusMinutes(30).isBefore(LocalDateTime.now())) {
                orderService.cancelOrder(order.getId());
            }
        });
    }
}

方案二:延遲隊(duì)列

使用消息隊(duì)列(如RabbitMQ)的延遲隊(duì)列功能,當(dāng)訂單生成時(shí)將訂單ID推送到延遲隊(duì)列,設(shè)置30分鐘后過期,過期后消費(fèi)該消息,取消訂單。

@Service
public class OrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void createOrder(Order order) {
        // 保存訂單至數(shù)據(jù)庫(kù)
        saveOrderToDB(order);
        // 將訂單ID推送至延遲隊(duì)列
        rabbitTemplate.convertAndSend("orderDelayExchange", "orderDelayKey", order.getId(), message -> {
            message.getMessageProperties().setDelay(30 * 60 * 1000); // 設(shè)置延遲時(shí)間
            return message;
        });
    }
}
@Component
@RabbitListener(queues = "orderDelayQueue")
public class OrderDelayConsumer {
    @Autowired
    private OrderService orderService;
    @RabbitHandler
    public void process(String orderId) {
        // 取消訂單
        orderService.cancelOrder(orderId);
    }
}

方案三:Redis過期事件

利用Redis的鍵過期事件功能,當(dāng)訂單生成時(shí)在Redis中存儲(chǔ)一個(gè)鍵,設(shè)置30分鐘過期,鍵過期時(shí)通過Redis的過期事件通知功能觸發(fā)訂單取消操作。

@Service
public class OrderService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    public void createOrder(Order order) {
        // 保存訂單至數(shù)據(jù)庫(kù)
        saveOrderToDB(order);
        // 在Redis中存儲(chǔ)一個(gè)鍵,設(shè)置30分鐘過期
        redisTemplate.opsForValue().set("order:" + order.getId(), order.getId(), 30, TimeUnit.MINUTES);
    }
    // 當(dāng)鍵過期時(shí),Redis會(huì)自動(dòng)調(diào)用該方法(需要配置Redis的過期事件通知功能)
    public void onOrderKeyExpired(String orderId) {
        cancelOrder(orderId);
    }
}

補(bǔ)充一下配置Redis的過期事件通知功能如下: Redis的鍵過期通知是一種典型的發(fā)布-訂閱模式。在Redis中,我們可以訂閱到某些特定的事件。鍵過期事件就是其中之一。但需要注意,要使用這個(gè)功能,需要確保你的Redis服務(wù)器開啟了相關(guān)配置。

下面是具體的步驟和示例:

  • 首先需要確保Redis的配置文件(通常是redis.conf)中開啟了鍵空間通知功能。你可以通過在配置文件中添加或修改如下配置實(shí)現(xiàn):
notify-keyspace-events "Ex"

這里的"Ex"表示只監(jiān)聽鍵過期事件。如果需要監(jiān)聽其他類型的事件,可以參考Redis官方文檔進(jìn)行配置。

  • 然后在Spring Boot應(yīng)用中,可以使用RedisMessageListenerContainer來(lái)訂閱Redis的鍵過期事件,并指定回調(diào)方法進(jìn)行處理。示例如下:
@Configuration
public class RedisConfig {
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;
    @Bean
    RedisMessageListenerContainer container() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        // 訂閱所有db的過期事件
        container.addMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] pattern) {
                String expiredKey = message.toString();
                if (expiredKey.startsWith("order:")) {
                    // 處理訂單超時(shí)邏輯
                    String orderId = expiredKey.split(":")[1];
                    // 這里調(diào)用你的服務(wù)類方法,處理訂單超時(shí)邏輯
                    // orderService.cancelOrder(orderId);
                }
            }
        }, new PatternTopic("__keyevent@*__:expired"));
        return container;
    }
}

在這個(gè)示例中,"__keyevent@*__:expired"是一個(gè)模式匹配的主題,它可以匹配所有數(shù)據(jù)庫(kù)的鍵過期事件。當(dāng)一個(gè)鍵過期時(shí),onMessage方法會(huì)被調(diào)用,你可以在這里加入你的邏輯來(lái)處理訂單的超時(shí)取消。

請(qǐng)注意,這里的代碼只是一個(gè)基本示例。在實(shí)際使用中,你可能需要根據(jù)自己的需要對(duì)代碼進(jìn)行相應(yīng)的調(diào)整和優(yōu)化。

總結(jié)

以上三種方案都可以實(shí)現(xiàn)訂單在30分鐘內(nèi)未支付則自動(dòng)取消的需求。根據(jù)實(shí)際業(yè)務(wù)需求、系統(tǒng)負(fù)載和其他因素,可以選擇最適合自己系統(tǒng)的實(shí)現(xiàn)方案。每種方案都有其優(yōu)缺點(diǎn),需要根據(jù)具體情況權(quán)衡。

以上就是SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的三種方案分享的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot實(shí)現(xiàn)訂單自動(dòng)取消的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA生成pdf文件的實(shí)操指南

    JAVA生成pdf文件的實(shí)操指南

    最近項(xiàng)目需要實(shí)現(xiàn)PDF下載的功能,由于沒有這方面的經(jīng)驗(yàn),從網(wǎng)上花了很長(zhǎng)時(shí)間才找到相關(guān)的資料,下面這篇文章主要給大家介紹了關(guān)于JAVA生成pdf文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • springIOC的使用流程及spring中使用類型轉(zhuǎn)換器的方式

    springIOC的使用流程及spring中使用類型轉(zhuǎn)換器的方式

    Spring IOC是Spring框架的核心原理之一,它是一種軟件設(shè)計(jì)模式,用于管理應(yīng)用程序中的對(duì)象依賴關(guān)系,這篇文章主要介紹了springIOC的使用流程以及spring中如何使用類型轉(zhuǎn)換器,需要的朋友可以參考下
    2023-06-06
  • Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn)

    Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn)

    這篇文章主要介紹了Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn),幫助大家選擇合適的自動(dòng)構(gòu)建工具,更好的構(gòu)建項(xiàng)目,感興趣的朋友可以了解下
    2020-10-10
  • java對(duì)圖片進(jìn)行壓縮和resize縮放的方法

    java對(duì)圖片進(jìn)行壓縮和resize縮放的方法

    本篇文章主要介紹了java對(duì)圖片進(jìn)行壓縮和resize調(diào)整的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 為什么rest接口返回json建議采用下劃線形式,不要用駝峰

    為什么rest接口返回json建議采用下劃線形式,不要用駝峰

    為什么rest接口返回json建議采用下劃線形式,不要用駝峰?今天小編就來(lái)為大家說(shuō)明一下原因,還等什么?一起跟隨小編過來(lái)看看吧
    2020-09-09
  • Java編程swing組件JLabel詳解以及使用示例

    Java編程swing組件JLabel詳解以及使用示例

    這篇文章主要介紹了Java編程swing組件JLabel詳解以及使用示例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Intellj Idea中的maven工程Java文件顏色不對(duì),未被識(shí)別的解決

    Intellj Idea中的maven工程Java文件顏色不對(duì),未被識(shí)別的解決

    這篇文章主要介紹了Intellj Idea中的maven工程Java文件顏色不對(duì),未被識(shí)別的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-08-08
  • Springboot webscoket自定義定時(shí)器

    Springboot webscoket自定義定時(shí)器

    這篇文章主要介紹了Springboot webscoket自定義定時(shí)器問題,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來(lái)一種解題優(yōu)化的思路
    2023-01-01
  • Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解

    Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解

    這篇文章主要為大家?介紹了Springboot遷移到Micronaut實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟

    IDEA導(dǎo)入jar包的完整實(shí)現(xiàn)步驟

    由于導(dǎo)入jar包項(xiàng)目存在很多不確定的問題,導(dǎo)致每次都需要調(diào)試、配置好多遍,對(duì)此特意記錄下來(lái),這篇文章主要給大家介紹了關(guān)于IDEA導(dǎo)入jar包的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評(píng)論