#### 基于注解
基于注解@Scheduled默認為單線程,開啟多個任務時,任務的執行時機會受上一個任務執行時間的影響。
使用SpringBoot基于注解來創建定時任務非常簡單,只需幾行代碼便可完成。?代碼如下:
```
@Component
@Configuration //1.主要用于標記配置類,兼備Component的效果。
@EnableScheduling // 2.開啟定時任務
public class SaticScheduleTask {
//3.添加定時任務
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定時間間隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void configureTasks() {
System.err.println("執行靜態定時任務時間: " + LocalDateTime.now());
}
}
```
#### 1、@Scheduled(fixedDelay = 5000)
將以一個固定延遲時間5秒鐘調用一次執行,這個周期是以上一個調用任務的完成時間為基準,在上一個任務完成之后,5s后再次執行。
#### 2、@Scheduled(fixedRate = 5000)
將以一個固定速率5s來調用一次執行,這個周期是以上一個任務開始時間為基準,從上一任務開始執行后5s再次調用。
#### 3、cron表達式
@Scheduled(cron = "0 */60 * * * ?")//每1小時(60分鐘)執行一次
```
"0?0?10,14,16?*?*??"?每天上午10點,下午2點,4點
"0?0/30 9-17?*?*??"??朝九晚五工作時間內每半小時
"0?0?12???*?WED" 表示每個星期三中午12點
"0?0?12?*?*??"?每天中午12點觸發
"0?15?10???*?*"?每天上午10:15觸發
"0?15?10?*?*??"?每天上午10:15觸發
"0?15?10?*?*???*"?每天上午10:15觸發
"0?15?10?*?*???2005" 2005年的每天上午10:15觸發
"0?*?14?*?*??"?在每天下午2點到下午2:59期間的每1分鐘觸發
"0?0/5?14?*?*??"?在每天下午2點到下午2:55期間的每5分鐘觸發
"0?0/5?14,18?*?*??"?在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發?
"0?0-5?14?*?*??"?在每天下午2點到下午2:05期間的每1分鐘觸發
"0?10,44?14???3?WED"?每年三月的星期三的下午2:10和2:44觸發
"0?15?10???*?MON-FRI"?周一至周五的上午10:15觸發
"0?15?10?15?*??"?每月15日上午10:15觸發
"0?15?10?L?*??"?每月最后一日的上午10:15觸發
"0?15?10???*?6L"?每月的最后一個星期五上午10:15觸發
"0?15?10???*?6L?2002-2005"?2002年至2005年的每月的最后一個星期五上午10:15觸發
"0?15?10???*?6#3" 每月的第三個星期五上午10:15觸發
```
#### 多個定時任務沖突、不執行,增加定時任務線程數
```
spring的定時任務默認是單線程,多個任務執行起來時間會有問題:B任務會因為A任務執行起來需要20S而被延后20S執行,需要增加定時任務配置,配置定時任務連接池大小。
SpringBoot解決方案:
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executors;
@Configuration
public class ScheduleConfig implements SchedulingConfigurer{
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//參數傳入一個size為10的線程池
scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
SSM框架解決方案:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
classpath:/org/springframework/beans/factory/xml/spring-beans-4.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.1.xsd">
<!-- 注解式 -->
<task:annotation-driven executor="taskExecutor" proxy-target-class="true" scheduler="scheduler" />
<!-- 配置處理定時任務的線程池 -->
<task:scheduler id="myScheduler" pool-size="5" />
<!-- 配置處理 異步定時任務的 線程池 -->
<beans:bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 核心線程數 -->
<beans:property name="corePoolSize" value="5" />
<!-- 最大線程數 -->
<beans:property name="maxPoolSize" value="10" />
<!-- 隊列最大長度 -->
<beans:property name="queueCapacity" value="25" />
<!-- 線程池維護線程所允許的空閑時間,默認為60s -->
<beans:property name="keepAliveSeconds" value="300" />
<!-- 線程池對拒絕任務(無線程可用)的處理策略 ThreadPoolExecutor.CallerRunsPolicy策略 ,調用者的線程會執行該任務,如果執行器已關閉,則丟棄. -->
<beans:property name="rejectedExecutionHandler">
<beans:bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
</beans:property>
</beans:bean>
</beans>
```
- JDK常用知識庫
- JDK各個版本安裝
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 選擇排序
- 插入排序
- 歸并排序
- 快速排序
- 堆排序
- 希爾排序
- 計數排序
- 桶排序
- 基數排序
- 總結
- 常用工具類
- 浮點型計算
- 時間格式處理
- 常用功能點思路整理
- 登錄
- 高并發
- 線程安全的單例模式
- Tomcat優化
- Tomcat之APR模式
- Tomcat啟動過慢問題
- 常用的數據庫連接池
- Druid連接池
- 緩存
- Redis
- SpringBoot整合Redis
- 依賴和配置
- RedisTemplate工具類
- 工具類使用方法
- Redis知識庫
- Redis安裝
- Redis配置參數
- Redis常用Lua腳本
- MongoDB
- SpringBoot操作MongoDB
- 依賴和配置
- MongoDB工具類
- 工具類使用方法
- 消息中間件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定時任務
- 啟動加載
- 事務
- JSP
- 靜態類注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陸驗證
- 權限驗證
- 分布式應用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 刪
- 改
- 查
- 程序員小笑話
- 我給你講一個TCP的笑話吧
- 二進制笑話
- JavaScript的那點東西
- JavaScript內置對象及常見API詳細介紹
- JavaScript實現Ajax 資源請求
- JavaScript干貨
- 架構師成長之路
- JDK源碼解析
- ArrayList源碼解讀
- 設計模式
- 微服務架構設計模式
- 逃離單體煉獄
- 服務的拆分策略
- 全面解析SpringMvc框架
- 架構設計的六大原則
- 并發集合
- JUC并發編程
- 搜索引擎
- Solr
- Solr的安裝
- 分布式服務框架
- Dubbo
- 從零開始學HTMl
- 第一章-初識HTML
- 第二章-認識HTML標簽