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

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

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

方案一:定時任務

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

@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());
            }
        });
    }
}

方案二:延遲隊列

使用消息隊列(如RabbitMQ)的延遲隊列功能,當訂單生成時將訂單ID推送到延遲隊列,設置30分鐘后過期,過期后消費該消息,取消訂單。

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

方案三:Redis過期事件

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

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

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

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

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

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

  • 然后在Spring Boot應用中,可以使用RedisMessageListenerContainer來訂閱Redis的鍵過期事件,并指定回調方法進行處理。示例如下:
@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:")) {
                    // 處理訂單超時邏輯
                    String orderId = expiredKey.split(":")[1];
                    // 這里調用你的服務類方法,處理訂單超時邏輯
                    // orderService.cancelOrder(orderId);
                }
            }
        }, new PatternTopic("__keyevent@*__:expired"));
        return container;
    }
}

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

請注意,這里的代碼只是一個基本示例。在實際使用中,你可能需要根據(jù)自己的需要對代碼進行相應的調整和優(yōu)化。

總結

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

以上就是SpringBoot中實現(xiàn)訂單30分鐘自動取消的三種方案分享的詳細內容,更多關于SpringBoot實現(xiàn)訂單自動取消的資料請關注腳本之家其它相關文章!

相關文章

  • 在Spring異步調用中傳遞上下文的方法

    在Spring異步調用中傳遞上下文的方法

    這篇文章主要給大家介紹了關于如何在Spring異步調用中傳遞上下文的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Java中的服務發(fā)現(xiàn)與負載均衡及Eureka與Ribbon的應用小結

    Java中的服務發(fā)現(xiàn)與負載均衡及Eureka與Ribbon的應用小結

    這篇文章主要介紹了Java中的服務發(fā)現(xiàn)與負載均衡:Eureka與Ribbon的應用,通過使用Eureka和Ribbon,我們可以在Java項目中實現(xiàn)高效的服務發(fā)現(xiàn)和負載均衡,需要的朋友可以參考下
    2024-08-08
  • springboot lua檢查redis庫存的實現(xiàn)示例

    springboot lua檢查redis庫存的實現(xiàn)示例

    本文主要介紹了springboot lua檢查redis庫存的實現(xiàn)示例,為了優(yōu)化性能,通過Lua腳本實現(xiàn)對多個馬戲場次下的座位等席的庫存余量檢查,感興趣的可以了解一下
    2024-09-09
  • java9區(qū)分opens與exports

    java9區(qū)分opens與exports

    本篇文章主要給大家講述了java9中opens與exports的區(qū)別以及用法的不同之處,一起學習下吧。
    2018-02-02
  • SpringBoot實現(xiàn)緩存與數(shù)據(jù)庫雙寫策略的詳細代碼

    SpringBoot實現(xiàn)緩存與數(shù)據(jù)庫雙寫策略的詳細代碼

    在SpringBoot企業(yè)開發(fā)中,為了提升系統(tǒng)性能,我們都會給高頻查詢接口加上緩存,把熱點數(shù)據(jù)緩存起來,減少數(shù)據(jù)庫查詢壓力,因此本文給大家介紹了SpringBoot實現(xiàn)緩存與數(shù)據(jù)庫雙寫策略的詳細方法,需要的朋友可以參考下
    2026-04-04
  • Spring中Bean的作用域與生命周期詳解

    Spring中Bean的作用域與生命周期詳解

    這篇文章主要給大家介紹了Spring中Bean的生命周期和作用域及實現(xiàn)方式的相關資料,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧
    2021-08-08
  • springcloud feign docker上無法通訊的問題及解決

    springcloud feign docker上無法通訊的問題及解決

    這篇文章主要介紹了springcloud feign docker上無法通訊的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java遍歷Map的幾種方法分析

    java遍歷Map的幾種方法分析

    這篇文章主要介紹了java遍歷Map的幾種方法,結合實例形式分析了使用循環(huán)與迭代等方法操作Map遍歷的相關技巧,需要的朋友可以參考下
    2016-08-08
  • SpringBoot請求映射的五種優(yōu)化方式小結

    SpringBoot請求映射的五種優(yōu)化方式小結

    在Spring?Boot應用開發(fā)中,請求映射(Request?Mapping)是將HTTP請求路由到相應控制器方法的核心機制,合理優(yōu)化請求映射不僅可以提升應用性能,還能改善代碼結構,增強API的可維護性和可擴展性,本文將介紹5種Spring?Boot請求映射優(yōu)化方式,需要的朋友可以參考下
    2025-06-06
  • Spring Bean的線程安全問題

    Spring Bean的線程安全問題

    Spring容器中的Bean是否線程安全,本文主要介紹了Spring Bean的線程安全問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論

安溪县| 沾益县| 桃园县| 开江县| 象州县| 淮南市| 静安区| 长治县| 邢台县| 通许县| 金山区| 阳西县| 雷山县| 通州市| 若尔盖县| 柳州市| 清徐县| 南城县| 南京市| 四川省| 永昌县| 阳高县| 恭城| 宁阳县| 苍南县| 陆丰市| 济宁市| 古浪县| 岐山县| 铁岭县| 拉孜县| 康乐县| 临泽县| 乐至县| 通河县| 海兴县| 乌鲁木齐市| 宜君县| 青冈县| 通海县| 淮安市|