定時線程_SpringBoot定時任務,@Async多線程異步執行

一、使用SpringBoot實現定時任務

這個不是重點,就簡單的實現一下,至于cron表達式怎么寫也不是重點,自行百度即可。

1-1、基于?@Scheduled?注解的方式

import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;@Component@EnableSchedulingpublic class XdxOne {    @Scheduled(cron = "*/1 * * * * ?")    public void testOne(){        System.out.println("one "  + " "+ Thread.currentThread().getName());    }}

1-2、基于SchedulingConfigurer接口實現

import org.springframework.scheduling.Trigger;import org.springframework.scheduling.TriggerContext;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.SchedulingConfigurer;import org.springframework.scheduling.config.ScheduledTaskRegistrar;import org.springframework.scheduling.support.CronTrigger;import org.springframework.stereotype.Component;import java.util.Date;@Component // 1.主要用于標記配置類,兼備Component的效果。@EnableScheduling // 2.開啟定時任務public class XdxTestOne  implements SchedulingConfigurer {    @Override    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {        Runnable task = new Runnable() {            @Override            public void run() {                Thread t = Thread.currentThread();                String name = t.getName();                System.out.println("XdxTestOne=" + name);            }        };        Trigger trigger = new Trigger() {            @Override            public Date nextExecutionTime(TriggerContext triggerContext) {              // 這里我們可以通過去數據庫獲取cron表達式,從而實現動態                CronTrigger trigger = new CronTrigger("*/3 * * * * ?");                Date nextExec = trigger.nextExecutionTime(triggerContext);                return nextExec;            }        };        scheduledTaskRegistrar.addTriggerTask(task, trigger);    }}

上面兩種方式都可以實現定時任務,毫無疑問注解方式實現起來更為舒服。但假如你不想把這個cron表達式寫死,對于注解方式我們可能無可奈何(也可能是我沒有找到方法)。但是對于接口的方式,我們可以在設置的時候去數據庫獲取,這樣就實現了動態。

接口方式的定時任務每次執行的時候,都會去執行那個獲取cron的方法。

二、異步實現

上面只是簡單的實現了定時任務,一般來說也沒有什么問題,但是上面的方式是一個線程挨個執行定時任務,這就會導致比如你某個線程是1s執行一次,但是你另外一個定時任務執行一次需要10min,那么你的這個定時任務就會被阻塞。?

? 一般來說可能也不重要,因為只要最后執行就好了,但有時卻是致命的,比我在工作中有一個定時任務是及時去同步數據來處理,這個時候阻塞了就是致命的。因此我們需要開啟異步執行,也就是多線程執行,這樣你一個定時任務阻塞了,還有另外的線程去執行我們的定時任務。

2-1、對于使用@Scheduled注解方式實現異步

我們可以使用?@Async?注解實現異步(異步方法使用注解@Async的返回值只能為void或者Future),把@Async加在類或者方法上面,然后還需要一個?@EnableAsync來開啟異步。

@EnableAsync可以加在啟動類上面這樣可以直接開啟所有的異步,也可以單獨加在每個類上面。

2-1-1:版本差異

springBoot2.0 和 springBoot2.2 默認的線程池是不一樣的,2.0默認線程池每開啟一個新的任務都是新開一個線程的。2.2默認線程池有8個。

如果你的定時任務比較少,并且執行時間比較短其實上面兩種都沒啥關系。但是如果定時任務多且慢,那么2.0每次創建一個線程可能導致JVM掛掉,而2.2只有8個線程也會滿足不了,會導致任務等待。

2-1-2:自定義線程池

創建一個線程池:

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.CallerRunsPolicy;@Configuration@EnableAsyncpublic class AsyncConfig {    @Bean(name = "taskExecutor")    public ThreadPoolTaskExecutor asyncExecutor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        // 核心線程數        executor.setCorePoolSize(10);        // 最大線程數        executor.setMaxPoolSize(50);        // 隊列最大長度        executor.setQueueCapacity(1000);        // 線程池維護線程所允許的空閑時間        executor.setKeepAliveSeconds(100);        // 線程前綴        executor.setThreadNamePrefix("AsyncExecutorThread-");        // 線程池對拒絕任務(無線程可用)的處理策略        executor.setRejectedExecutionHandler(new CallerRunsPolicy());        executor.initialize();        return executor;    }}

我們創建了上面的線程池后,所有的任務都將使用這個線程池里面的線程(可以通過輸出線程名查看)

但是如果我們有多個線程池的時候,這個時候我們可以使用?@Async(“name”)?name就是線程池的名字,沒有寫name的時候默認使用bean為taskExecutor?的線程池。

2-2、對于使用接口的方式實現異步

e8fa3ba3f369bcbec25bef765196797b.png

而對于使用注解的定時任務,如果你沒有使用@Async注解給它指定線程池(可以理解默認name = taskExecutor,如果你沒有taskExecutor線程池就會使用默認線程池),它也會使用接口里面創建的線程池進行調用。

三、其它

@EnableScheduling注解是開啟定時任務的,隨便放在那里都可以,只需要一個。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530351.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot入門一

SpringBoot能夠很簡單的創建一個直接運行的單體Spring應用 特性: 單體Spring應用內置的tomcat、Jetty提供默認的starter來構建配置自動配置Spring和第三方庫 推薦一個很好的學習教程,https://blog.csdn.net/u010486495/article/details/79348302 1 構…

mysql怎么把datetime類型轉換_mysql怎樣實現time轉datetime

mysql實現time轉datetime的方法:使用在sql語句中【FROM_UNIXTIME(時間值)】,代碼為【insert into test(time) values(FROM_UNIXTIME(%d))",time(NULL)】。mysql實現time轉datetime的方法:FROM_UNIXTIME(time(NULL))將liunx系統的time_t類…

SpringBoot入門二

參考Spring Boot Starters - 御坂研究所 創建自己的starter starter是依賴的一種synthesize&#xff08;合成&#xff09;。 starter會把需要用到的依賴全部包含進來&#xff0c;避免開發者自己手動引入依賴。 starter的邏輯 pom.xml<parent><groupId>org.spri…

Tomcat入門

一&#xff0c;tomcat啟動 雙擊startup.bat,如果出現一閃而過的情況&#xff0c;在文件的末尾添加pause&#xff0c;就可以看到環境變量設置的路徑是否正確 如果無法在電腦的高級系統設置中設置環境變量&#xff0c;可以在setclasspath.bat中設置環境變量 set JAVA_HOMEC:\P…

php mysql 圖像_將圖像插入MySQL并使用PHP檢索圖像

此文可能比較繁瑣&#xff0c;有更好的方法&#xff0c;但是出于教程目的&#xff0c;這是我的"“最佳實踐”的路線。今天&#xff0c;我們將討論一個似乎每個人都有些困惑的話題……在MySQL中存儲BLOB圖像&#xff0c;然后使用PHP再次顯示它們。盡管始終建議不要這樣做&a…

利用Maven逆向工程生成mybatis映射文件

一&#xff0c;pom.xml 注意修改逆向工程配置文件的路徑 <build><pluginManagement><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1…

mysql update多個表_mysql update 多表 (復制)

定我們有兩張表&#xff0c;一張表為Product表存放產品信息&#xff0c;其中有產品價格列Price&#xff1b;另外一張表是ProductPrice表&#xff0c;我們要將ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。在Mysql中我們有幾種手段可以做到這一點&#xff0c;…

ORA-00907:missing right parenthesis缺少右括號

一&#xff0c;有嵌套查詢&#xff0c;并且子查詢中用了union all合并兩個查詢時&#xff0c;前一個查詢用了order by&#xff0c;那么會報錯并提示ORA-00907:missing right parenthesis缺少右括號&#xff1a; select * from ( select t.* from emp t where t.jobMANAGER ord…

mysql重復記錄大于十的數據庫_面試官:在使用mysql數據庫時,遇到重復數據怎么處理?...

前言前段時間&#xff0c;很多人問我能不能寫一些數據庫的文章&#xff0c;正好自己在測試mysql數據庫性能的時候&#xff0c;出現了一個問題&#xff0c;也就是出現了很多重復的數據&#xff0c;想起來自己long long ago寫過一篇類似的&#xff0c;僅此就拿來總結了一下。如果…

線程組的概念

一&#xff0c;線程組和線程的結構&#xff1a;樹形結構 每個Thread必然存在于一個ThreadGroup中&#xff0c;Thread不能獨立于ThreadGroup存在。 執行main()方法線程的名字是main 如果在new Thread時沒有顯式指定&#xff0c;那么默認將父線程&#xff08;當前執行new Threa…

mysql中ak替換鍵_數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束...

數據庫:唯一性約束_alternate key(替換鍵) mySQL Oracle 數據庫 ak 唯一性約束數據庫:唯一性約束所謂唯一性約束(unique constraint)不過是數據表內替代鍵的另一個名稱而已。替代鍵(alternate key)可以是數據表內不作為主鍵的其他任何列&#xff0c;只要該鍵對該數據表唯一即可…

Oracle自定義類型

Oracle自定義類型可以通過type/create type來聲明或者創建 一&#xff0c;四種創建方式 1.1&#xff0c;使用create type創建object類型 create or replace type obj_type as object(id number,name varchar2(50 byte),birthday date); 1.2&#xff0c;使用create type創建…

Oracle/mysql查詢語句的執行過程

執行順序 from on join/pivot/unpivot(mysql沒有pivot和unpivot) where group by having select distinct order by limit&#xff08;oralce沒有&#xff09; 書寫順序 select distinct <select_list> from <left_table> <join_type>join <righ…

mysql定時sql腳本_定時執行的SQL腳本

因為要同步一個表&#xff0c;所以每天要同步一次數據&#xff0c;但是對SQL不是精通的我&#xff0c;為了測試寫了一段代碼來測試定時功能創建一個存儲過程&#xff0c;是用來插數據的&#xff0c;沒有輸出和輸出參數create or replace procedure temp_pro asbegininsert into…

mysql xml語句_Mysql語句

xml文件轉義字符處理(1)(2)直接寫轉義后的字符1、mysql里批量修改表內某個字段內的部分數據UPDATE inventory_stockSET batchno REPLACE(batchno,-20-201901,-50-2019)2、ON DUPLICATE KEY UPDATE根據主鍵判斷是新增還是修改(也可以有兩個或多個主鍵)INSERT INTO TABLE (a,c) …

destoon網站mysql分表_destoon : 常用數據庫操作

destoon在初始化系統后系統會自動連接數據庫&#xff0c;并將數據庫操作對象保存在$db。對于數據庫操作方法參考include/db_mysql.class.php函數原型&#xff0c;我來寫幾個常用數據庫操作。1、讀取單條信息$S $db->get_one("SELECT * FROM {$DT_PRE}table WHERE xxxy…

delphi7 mysql控件_Delphi7連接MySql數據庫-DBGrid控件顯示數據

一個簡單的Delphi7小程序&#xff0c;使用MySql數據庫做簡單查詢&#xff0c;用DBGrid控件顯示結果&#xff0c;實現過程如下&#xff1a;(1)在MySql中新建demouser表&#xff0c;插入記錄用于測試。(2)在Delphi7中新建項目。(3)在From中添加組件。組件Panel&#xff1a;pnl1組…

for循環false 終止 python_python3.5.1給用戶3次無效的嘗試,然后終止pgm(Simple FOR循環)...

我需要幫助(新生-2周)。我想得到這段代碼可能的最微小的變化&#xff0c;允許用戶3次在程序中輸入錯誤的值。輸入錯誤值3次后&#xff0c;程序應終止。唯一的要求是代碼必須包含FOR循環。我不知道它是需要一個FOR循環還是3個FOR循環(每次轉換一個)。我嘗試了很多種方案&#xf…

mysql何時會走索引

訪問類型&#xff0c;這里只列出最常見的6種類型 all,index,range,ref,eq_ref&#xff0c;const mysql中explain的type的解釋_dennis211的博客-CSDN博客_explain type 使用不同的運算符時訪問類型不一樣&#xff1a; !、not in、<>、>、<、in(多個值)、or、bet…

mysql數據庫唯一性_在MySQL數據庫中添加唯一性約束,范圍可能嗎?

我有一個使用MySQL的Rails應用程序。我在兩個模型之間有一個has_many :through關聯&#xff0c;如下所述&#xff1a;class Category < ActiveRecord::Basehas_many :category_pairingshas_many :dishes, through: :category_pairings, :inverse_of > :categoriesendclas…