這篇文章主要講解了“springboot怎么解決多個deploy執(zhí)行schedule定時器導(dǎo)致并發(fā)問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“springboot怎么解決多個deploy執(zhí)行schedule定時器導(dǎo)致并發(fā)問題”吧!
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)岱岳免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
springboot部署多個相同服務(wù)deploy,當(dāng)服務(wù)中有定時器時,一旦定時器觸發(fā)時服務(wù)會同時執(zhí)行,從而產(chǎn)生并發(fā)問題。解決方案:
1.在定時器類添加@Profile 注解 指定實(shí)例執(zhí)行定時器。
@Component @Configuration @EnableScheduling // 1.開啟定時任務(wù) @Profile("deploy01") public class ScheduleTaskService { .... }
它操作簡單,靈活。只需要添加@Profile注解,但它的局限性也很明顯,只有指定服務(wù)為deploy01時才會加載定時器處理類,一旦deploy01 掛掉或者未啟動就無法執(zhí)行。所以并不能達(dá)到高可用。
2.利用redis 緩存機(jī)制
@Scheduled(cron = "0 0 0/1 * * ? ") //每1小時執(zhí)行一次 public void insertPriRecoverCall() throws InterruptedException { String deployKey="deployName"; redisService.set(deployKey,deployId,1,TimeUnit.HOURS); Object o = redisService.get(deployKey); if (o!=null){ String deployName = o.toString(); if (deployId.equals(deployName)){ logger.info(deployName+" is running ....."); ////業(yè)務(wù)代碼 } } }
先獲取服務(wù)實(shí)例Id,緩存到redis中。redis 是key-value 鍵值對的緩存機(jī)制。在相同key下只會保留一個deployId ,再取出緩存中deployId和服務(wù)實(shí)例id 比較。相同就繼續(xù)執(zhí)行業(yè)務(wù)代碼,不同則直接過濾。這樣既可以防止并發(fā)問題,又可以實(shí)現(xiàn)高可用。
感謝各位的閱讀,以上就是“springboot怎么解決多個deploy執(zhí)行schedule定時器導(dǎo)致并發(fā)問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對springboot怎么解決多個deploy執(zhí)行schedule定時器導(dǎo)致并發(fā)問題這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!