task/ 目錄下,我新建了一個OrderSchedule,處理Order相關排程函式。expiredOrderScheduling 處理此問題。// OrderDao.java
@Query("select order from Order order WHERE order.status = 'UNPAID' AND order.create_time <= :expiredTime")
List<Order> findAllExpiredUnpaidOrder(@Param("expiredTime") Instant expiredTime);
CANCELED。@Transactional
// 每分鐘polling一次
@Scheduled(cron = "0 */1 * * * ?")
public void expiredOrderScheduling(){
// 這邊先以1分鐘就過期測試
List<Order> orderList = orderDao.findAllExpiredUnpaidOrder(Instant.now().minus(Duration.ofMinutes(1)));
if (orderList.isEmpty()) return;
log.info("Found {} expired orders", orderList.size());
int canceledCount = 0;
for (Order order : orderList){
if (order.getStatus() != Order.STATUS.UNPAID) continue;
order.setStatus(Order.STATUS.CANCELED);
canceledCount++;
}
orderDao.saveAll(orderList);
log.info("Successfully canceled {} orders", canceledCount);
}
CANCELED」。.save,並不會rollback本篇文章出自《每天學Java直到今年結束》Day222,大家可以到我的網站上查看~