今天BOSS約了個(gè)面試,HR直接發(fā)我一道面試題

作者:JavaPub
編程學(xué)習(xí)一條龍:http://luxian.javapub.net.cn
前言
在電商、外賣、預(yù)約服務(wù)等場(chǎng)景中,訂單超時(shí)自動(dòng)取消是一個(gè)常見的業(yè)務(wù)需求。這一功能不僅提高了系統(tǒng)的自動(dòng)化程度,還為用戶提供了更好的體驗(yàn)。需求如下:
TODO
如果用戶在生成訂單后一定時(shí)間未支付,則系統(tǒng)自動(dòng)取消訂單。
接下來(lái)就用 SpringBoot 實(shí)現(xiàn)訂單超時(shí)未支付自動(dòng)取消的幾種方案,并提供相應(yīng)的代碼示例。
技術(shù)選型
基于產(chǎn)品需求,我們首先會(huì)思考可行性的解決方案。
-
Spring Task:Spring Boot內(nèi)置了任務(wù)調(diào)度功能,可以很方便地實(shí)現(xiàn)定時(shí)任務(wù)。我們可以利用
@Scheduled注解來(lái)定義一個(gè)定時(shí)任務(wù),定期檢查訂單狀態(tài)并執(zhí)行相應(yīng)的取消操作。 -
異步處理:對(duì)于訂單超時(shí)這種非即時(shí)性的操作,我們可以使用異步處理來(lái)提高系統(tǒng)的響應(yīng)速度。Spring Boot 支持多種異步處理方式,如使用
@Async注解、配置線程池等。
方案一:使用定時(shí)任務(wù)
實(shí)現(xiàn)步驟
- 定義訂單實(shí)體:在數(shù)據(jù)庫(kù)中,我們需要一個(gè)訂單表來(lái)存儲(chǔ)訂單信息,包括訂單狀態(tài)、創(chuàng)建時(shí)間等。
@Entity
public class Order {
@Id
private Long id;
private String userId;
private OrderStatus status; // 訂單狀態(tài)
private Date createTime; // 訂單創(chuàng)建時(shí)間
// 其他字段和getter、setter方法
}
- 創(chuàng)建定時(shí)任務(wù):使用Spring Task創(chuàng)建一個(gè)定時(shí)任務(wù),定期檢查訂單狀態(tài)。
@Component
public class OrderTimeoutTask {
@Autowired
private OrderService orderService;
@Scheduled(fixedRate = 5000) // 每5秒執(zhí)行一次
public void checkOrderTimeout() {
List<Order> timeoutOrders = orderService.findTimeoutOrders();
timeoutOrders.forEach(order -> orderService.cancelOrder(order.getId()));
}
}
- 實(shí)現(xiàn)訂單服務(wù):在訂單服務(wù)中,我們實(shí)現(xiàn)查找超時(shí)訂單和取消訂單的邏輯。
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public List<Order> findTimeoutOrders() {
// 根據(jù)業(yè)務(wù)規(guī)則查找超時(shí)訂單,例如:當(dāng)前時(shí)間減去訂單創(chuàng)建時(shí)間大于超時(shí)閾值
return orderRepository.findByStatusAndCreateTimeBefore(OrderStatus.PENDING_PAYMENT, new Date(System.currentTimeMillis() - TIMEOUT_THRESHOLD));
}
public void cancelOrder(Long orderId) {
Order order = orderRepository.findById(orderId).orElse(null);
if (order != null && order.getStatus().equals(OrderStatus.PENDING_PAYMENT)) {
order.setStatus(OrderStatus.CANCELED);
orderRepository.save(order);
}
}
}
四、注意事項(xiàng)
-
定時(shí)任務(wù)的頻率:定時(shí)任務(wù)的頻率應(yīng)根據(jù)業(yè)務(wù)需求和系統(tǒng)性能進(jìn)行權(quán)衡。如果頻率過(guò)高,可能會(huì)增加系統(tǒng)負(fù)擔(dān);如果頻率過(guò)低,可能導(dǎo)致訂單超時(shí)后不能及時(shí)取消。
-
異常處理:在定時(shí)任務(wù)或異步處理中,應(yīng)做好異常處理,避免因?yàn)槟硞€(gè)訂單取消失敗而影響其他訂單的處理。
-
數(shù)據(jù)庫(kù)事務(wù):在更新訂單狀態(tài)時(shí),應(yīng)注意數(shù)據(jù)庫(kù)事務(wù)的處理,確保數(shù)據(jù)的一致性。
通過(guò)以上步驟,我們可以在 Spring Boot 中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消的策略。在實(shí)際應(yīng)用中,還需要根據(jù)具體業(yè)務(wù)需求進(jìn)行調(diào)整和優(yōu)化。
