當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Schedule关闭订单
生活随笔
收集整理的這篇文章主要介紹了
Spring Schedule关闭订单
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫一個最簡單的版本,因為我們是一個Schedule,不需要返回值,closeOrderTaskV1,第一個版本,那如果其實我們不是TOMCAT集群的話,我們這一個方法就OK了,但是我們是TOMCAT集群,所以呢,需要創建一個分布式鎖,那第一個版本是沒有分布式鎖的,非常簡單,我們一起來寫一下,首先加上@Schedule這么一個注解,這個包是annotation里面的scheduled的,千萬不要加錯,然后括號里面寫一下,我們需要它每一分鐘執行一次,等于什么呢,用引號引一下,cron="0 */1 * * * ?",每個一分鐘的整數倍,然后填充一下他的邏輯/*** 沒有分布式鎖,運行起來來看日志。*/
// @Scheduled(cron="0 */1 * * * ?")//每1分鐘(每個1分鐘的整數倍)public void closeOrderTaskV1(){int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));iOrderService.closeOrder(hour);}public class PropertiesUtil {private static Properties props;static {String fileName = "mmall.properties";props = new Properties();try {props.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName),"UTF-8"));} catch (IOException e) {log.error("配置文件讀取異常",e);}}public static String getProperty(String key){String value = props.getProperty(key.trim());if(StringUtils.isBlank(value)){return null;}return value.trim();}public static String getProperty(String key,String defaultValue){String value = props.getProperty(key.trim());if(StringUtils.isBlank(value)){value = defaultValue;}return value.trim();}}從配置文件=里面獲取這個配置,如果key不存在也是兩個小時,那這里面的邏輯就是說,我們獲取兩個小時,也就是說每一分鐘我都會執行一下,這個定時任務會關閉,以當前時間為準,兩個小時之前下單,但是呢,未付款的訂單,那為了驗證方便呢,我們加一行日志,關閉訂單定時任務啟動,說明我們寫的Spring Schedule定時任務,是生效的,因為我們的頻率比較高,每一分鐘要執行一次,@Overridepublic void closeOrder(int hour) {Date closeDateTime= DateUtils.addHours(new Date(),-hour);List<Order> orderList = orderMapper.selectOrderStatusByCreateTime(Const.OrderStatusEnum.NO_PAY.getCode(),DateTimeUtil.dateToStr(closeDateTime));for(Order order : orderList){List<OrderItem> orderItemList = orderItemMapper.getByOrderNo(order.getOrderNo());for(OrderItem orderItem : orderItemList){//使用寫獨占鎖,一定要用主鍵where條件,防止鎖表。同時必須是支持MySQL的Innodb。Integer stock = productMapper.selectStockByProductId(orderItem.getProductId());//考慮到已生成的訂單里的產品,被刪除的情況if(stock == null){continue;}Product product = new Product();product.setId(orderItem.getProductId());product.setStock(stock+orderItem.getQuantity());productMapper.updateByPrimaryKeySelective(product);}orderMapper.closeOrderCloseByOrderId(order.getId());log.info("關閉訂單OrderNo:{}",order.getOrderNo());}}這個時候根據訂單狀態和createTime,開始找到orderList,那orderList我們一共找了755個,找到這訂單的OrderItemList,根據productId拿他的庫存,現在表里的庫存是995個,這個 時候stock就是995加1,現在我們是單擊來關閉沒有問題,那如果我們再啟動一個TOMCAT,現在我們要聚焦在分布式任務調度上,這樣就造成了一個問題,什么問題,這個定時任務我只希望,在TOMCAT集群環境下,一個服務執行就可以了,并不需要大家都來執行它,并且如果大家一起執行的話,也浪費了MYSQL和服務器的一個性能,因為其他機器不需要執行,只執行一臺就行,第二個就很容易造成數據錯亂,因為大家都在執行SQL語句,那接下來我們就講使用redis實現分布式鎖的一個原理,來解決這一個問題
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Spring Schedule关闭订单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Schedule配置及初始
- 下一篇: SpringBoot_入门-课程简介