SpringBoot中實現(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)訂單自動取消的資料請關注腳本之家其它相關文章!
相關文章
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)示例,為了優(yōu)化性能,通過Lua腳本實現(xiàn)對多個馬戲場次下的座位等席的庫存余量檢查,感興趣的可以了解一下2024-09-09
SpringBoot實現(xiàn)緩存與數(shù)據(jù)庫雙寫策略的詳細代碼
在SpringBoot企業(yè)開發(fā)中,為了提升系統(tǒng)性能,我們都會給高頻查詢接口加上緩存,把熱點數(shù)據(jù)緩存起來,減少數(shù)據(jù)庫查詢壓力,因此本文給大家介紹了SpringBoot實現(xiàn)緩存與數(shù)據(jù)庫雙寫策略的詳細方法,需要的朋友可以參考下2026-04-04
springcloud feign docker上無法通訊的問題及解決
這篇文章主要介紹了springcloud feign docker上無法通訊的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

