<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上次的部落格疏忽了定時器的一個大重點…
實際開發專案中一定不止一個定時器,很多場景都需要用到,而多個定時器帶來的問題 : 就是如何避免多個定時器的互相沖突。
推薦一個 Spring Boot 基礎教學及實戰範例:https://github.com/javastacks/spring-boot-best-practice
我們的訂單服務,一般會有一個待支付訂單,而這個待支付訂單是有時間限制的,比如阿里巴巴的訂單是五天,淘寶訂單是一天,拼多多訂單是一天,美團訂單是15分鐘…
基金系統中,如何同時更新多個儲存分割區中的基金資訊…
總的來說,實際開發中定時器需要解決多個定時器同時並行的問題,也要解決定時器之間的衝突問題
問題不大,說到並行那就離不開多執行緒了…慢慢看看就懂了
我們清晰的看到執行結果都是scheduling-1
就此可以判定,Springboot定時器預設的是單執行緒的
但是問題就來了,如果線上程爭奪資源後,某個執行緒需要比較長時間才能執行完,那其他的定時器怎麼辦,都只能進入等待狀態,時間越久,累計等待的定時器越多,這就容易引起雪崩…
其實只需要新增一個設定類然後加註解就可以解決問題了
具體程式碼如下 :
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class SchedulerTaskController { private Logger logger= LoggerFactory.getLogger(SchedulerTaskController.class); private static final SimpleDateFormat dateFormat=new SimpleDateFormat("HH:mm:ss"); private int count=0; @Scheduled(cron="*/6 * * * * ?") @Async("threadPoolTaskExecutor") public void process(){ logger.info("英文:this is scheduler task runing "+(count++)); } @Scheduled(fixedRate = 6000) @Async("threadPoolTaskExecutor") public void currentTime(){ logger.info("中文:現在時間"+dateFormat.format(new Date())); } }
具體程式碼如下 :
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; /**使用多執行緒的時候,往往需要建立Thread類,或者實現Runnable介面,如果要使用到執行緒池,我們還需要來建立Executors, * 在使用spring中,已經給我們做了很好的支援。只要要@EnableAsync就可以使用多執行緒 * 通過spring給我們提供的ThreadPoolTaskExecutor就可以使用執行緒池。*/ //@Configuration 表示該類是一個設定類 @Configuration @EnableAsync //所有的定時任務都放在一個執行緒池中,定時任務啟動時使用不同都執行緒。 public class TaskScheduleConfig { private static final int corePoolSize = 10; // 預設執行緒數 private static final int maxPoolSize = 100; // 最大執行緒數 private static final int keepAliveTime = 10; // 允許執行緒空閒時間(單位:預設為秒),十秒後就把執行緒關閉 private static final int queueCapacity = 200; // 緩衝佇列數 private static final String threadNamePrefix = "it-is-threaddemo-"; // 執行緒池名字首 @Bean("threadPoolTaskExecutor") // bean的名稱,預設為首字母小寫的方法名 public ThreadPoolTaskExecutor getDemoThread(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(keepAliveTime); executor.setKeepAliveSeconds(queueCapacity); executor.setThreadNamePrefix(threadNamePrefix); //執行緒池拒絕任務的處理策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //初始化 executor.initialize(); return executor; } }
然後我們可以很清晰地看到:
如上,也就解決了用多執行緒解決Springboot多定時器衝突的問題
到此這篇關於Spring Boot 多個定時器衝突問題的解決方法的文章就介紹到這了,更多相關Spring Boot 定時器衝突內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45