當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
Spring Schedule关闭订单
生活随笔
收集整理的這篇文章主要介紹了
Spring Schedule关闭订单
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
寫一個(gè)最簡(jiǎn)單的版本,因?yàn)槲覀兪且粋€(gè)Schedule,不需要返回值,closeOrderTaskV1,第一個(gè)版本,那如果其實(shí)我們不是TOMCAT集群的話,我們這一個(gè)方法就OK了,但是我們是TOMCAT集群,所以呢,需要?jiǎng)?chuàng)建一個(gè)分布式鎖,那第一個(gè)版本是沒(méi)有分布式鎖的,非常簡(jiǎn)單,我們一起來(lái)寫一下,首先加上@Schedule這么一個(gè)注解,這個(gè)包是annotation里面的scheduled的,千萬(wàn)不要加錯(cuò),然后括號(hào)里面寫一下,我們需要它每一分鐘執(zhí)行一次,等于什么呢,用引號(hào)引一下,cron="0 */1 * * * ?",每個(gè)一分鐘的整數(shù)倍,然后填充一下他的邏輯/*** 沒(méi)有分布式鎖,運(yùn)行起來(lái)來(lái)看日志。*/
// @Scheduled(cron="0 */1 * * * ?")//每1分鐘(每個(gè)1分鐘的整數(shù)倍)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();}}從配置文件=里面獲取這個(gè)配置,如果key不存在也是兩個(gè)小時(shí),那這里面的邏輯就是說(shuō),我們獲取兩個(gè)小時(shí),也就是說(shuō)每一分鐘我都會(huì)執(zhí)行一下,這個(gè)定時(shí)任務(wù)會(huì)關(guān)閉,以當(dāng)前時(shí)間為準(zhǔn),兩個(gè)小時(shí)之前下單,但是呢,未付款的訂單,那為了驗(yàn)證方便呢,我們加一行日志,關(guān)閉訂單定時(shí)任務(wù)啟動(dòng),說(shuō)明我們寫的Spring Schedule定時(shí)任務(wù),是生效的,因?yàn)槲覀兊念l率比較高,每一分鐘要執(zhí)行一次,@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){//使用寫?yīng)氄兼i,一定要用主鍵where條件,防止鎖表。同時(shí)必須是支持MySQL的Innodb。Integer stock = productMapper.selectStockByProductId(orderItem.getProductId());//考慮到已生成的訂單里的產(chǎn)品,被刪除的情況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("關(guān)閉訂單OrderNo:{}",order.getOrderNo());}}這個(gè)時(shí)候根據(jù)訂單狀態(tài)和createTime,開(kāi)始找到orderList,那orderList我們一共找了755個(gè),找到這訂單的OrderItemList,根據(jù)productId拿他的庫(kù)存,現(xiàn)在表里的庫(kù)存是995個(gè),這個(gè) 時(shí)候stock就是995加1,現(xiàn)在我們是單擊來(lái)關(guān)閉沒(méi)有問(wèn)題,那如果我們?cè)賳?dòng)一個(gè)TOMCAT,現(xiàn)在我們要聚焦在分布式任務(wù)調(diào)度上,這樣就造成了一個(gè)問(wèn)題,什么問(wèn)題,這個(gè)定時(shí)任務(wù)我只希望,在TOMCAT集群環(huán)境下,一個(gè)服務(wù)執(zhí)行就可以了,并不需要大家都來(lái)執(zhí)行它,并且如果大家一起執(zhí)行的話,也浪費(fèi)了MYSQL和服務(wù)器的一個(gè)性能,因?yàn)槠渌麢C(jī)器不需要執(zhí)行,只執(zhí)行一臺(tái)就行,第二個(gè)就很容易造成數(shù)據(jù)錯(cuò)亂,因?yàn)榇蠹叶荚趫?zhí)行SQL語(yǔ)句,那接下來(lái)我們就講使用redis實(shí)現(xiàn)分布式鎖的一個(gè)原理,來(lái)解決這一個(gè)問(wèn)題
?
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Spring Schedule关闭订单的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Schedule配置及初始
- 下一篇: 分布式锁编写及调试分析