成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

五分鐘搞定,實現定時任務的五種方案!

開發 前端
任務調度是指基于給定的時間點,給定的時間間隔或者給定執行次數自動得執行任務。任務調度是是操作系統的重要組成部分,而對于實時的操作系統,任務調度直接影響著操作系統的實時性能。

我們在實際開發中,多多少少都會用到定時任務來處理一些問題。

比如金融項目中的對賬,每天定時對昨天的賬務進行核對,每個月初對上個月的賬務進行核對等。

還比如,我們需要處理一些老數據遷移,修復一些新項目和老項目數據不兼容的問題等等。

常規實現方案

方案1:Timer

這個目前在項目中用得較少,直接貼demo代碼。

具體的介紹可以查看api ,但是在某些框架中是有用到。

public class TestTimer {

public static void main(String[] args){

TimerTask timerTask = new TimerTask() {
@Override
public void run(){
System.out.println("task run:"+ new Date());
}
};

Timer timer = new Timer();
//安排指定的任務在指定的時間開始進行重復的固定延遲執行。這里是每3秒執行一次
timer.schedule(timerTask,10,3000);
}
}

執行結果:

task  run:Sun Dec 11 21:23:47 CST 2022
task run:Sun Dec 11 21:23:50 CST 2022
task run:Sun Dec 11 21:23:53 CST 2022

這么使用,阿里代碼檢查插件會提示:

圖片

從提示中可以看出,在多線程并行處理定時任務時,Timer運行多個TimerTask時,只要有其中之一沒有捕獲拋出的異常,其他任務會自動終止運行。

方案2:ScheduledExecutorService

和Timer類型,也就是阿里代碼檢查插件推薦的方案:

public class TestScheduledExecutorService {

public static void main(String[] args){

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
// 參數:1、任務體 2、首次執行的延時時間
// 3、任務執行間隔 4、間隔時間單位
service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
}
}

運行結果:

task ScheduledExecutorService Sun Dec 11 21:30:06 CST 2022
task ScheduledExecutorService Sun Dec 11 21:30:09 CST 2022
task ScheduledExecutorService Sun Dec 11 21:30:12 CST 2022

阿里代碼檢查插件也會提示:

圖片

這里提示的是我們創建線程池的方式,建議我們使用手動創建線程池,不要使用??Executors??工廠類,因為手動創建更能有效規劃資源的使用。

方案3:spring task

用起來也非常簡單:

@Slf4j
@Component
public class ScheduledService {

@Scheduled(cron = "0/5 * * * * *")
public void scheduled(){
log.info("=====>>>>>使用cron {}",System.currentTimeMillis());
}

@Scheduled(fixedRate = 5000)
public void scheduled1(){
log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());
}

@Scheduled(fixedDelay = 5000)
public void scheduled2(){
log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());
}

}

運行結果:

2022-12-11 21:36:25.001  INFO 10660 --- [   scheduling-1] com.tian.utils.ScheduledService          : =====>>>>>使用cron  1670765785001
2022-12-11 21:36:28.212 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用fixedRate1670765788212
2022-12-11 21:36:28.212 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>fixedDelay1670765788212
2022-12-11 21:36:30.001 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用cron 1670765790001
2022-12-11 21:36:33.212 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用fixedRate1670765793212
2022-12-11 21:36:33.213 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>fixedDelay1670765793213
2022-12-11 21:36:35.001 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用cron 1670765795001
2022-12-11 21:36:38.214 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用fixedRate1670765798214
2022-12-11 21:36:38.214 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>fixedDelay1670765798214
2022-12-11 21:36:40.001 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用cron 1670765800001
2022-12-11 21:36:43.214 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>使用fixedRate1670765803214
2022-12-11 21:36:43.215 INFO 10660 --- [ scheduling-1] com.tian.utils.ScheduledService : =====>>>>>fixedDelay1670765803215

方案4:多線程執行

基于注解設定多線程定時任務 :

@Component
@EnableScheduling // 1.開啟定時任務
@EnableAsync // 2.開啟多線程
public class MultithreadScheduleTask {

@Async
@Scheduled(fixedDelay = 5000) //間隔5秒
public void first() throws InterruptedException {
System.out.println("第一個定時任務開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
System.out.println();
Thread.sleep(1000 * 10);
}

@Async
@Scheduled(fixedDelay = 5000)
public void second(){
System.out.println("第二個定時任務開始 : " + LocalDateTime.now().toLocalTime() + "\r\n線程 : " + Thread.currentThread().getName());
System.out.println();
}
}

運行結果:

第一個定時任務開始 : 21:44:02.800
線程 : 入庫操作日志記錄表 線程1

第二個定時任務開始 : 21:44:02.801
線程 : 入庫操作日志記錄表 線程2

第一個定時任務開始 : 21:44:07.801
線程 : 入庫操作日志記錄表 線程3

第二個定時任務開始 : 21:44:07.802
線程 : 入庫操作日志記錄表 線程4

第一個定時任務開始 : 21:44:12.807
線程 : 入庫操作日志記錄表 線程5

第二個定時任務開始 : 21:44:12.812
線程 : 入庫操作日志記錄表 線程6
......

方案5:quartz

我們需要引入依賴:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

實現類:

public class Myquartz extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("這是我的 quartz 定時任務");
}
}

配置類:

/**
* @author tianwc 公眾號:java后端技術全棧、面試專欄
* @version 1.0.0
* @date 2022年12月11日 21:48
*/
@Configuration
public class QuartzConfig {

@Bean
public JobDetail teatQuartzDetail(){
return JobBuilder.newJob(MyQuartz.class).withIdentity("myQuartz").storeDurably().build();
}

@Bean
public Trigger testQuartzTrigger(){
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()

.withIntervalInSeconds(10) //設置時間周期單位秒
.repeatForever();

return TriggerBuilder.newTrigger().forJob(teatQuartzDetail())

.withIdentity("testQuartz")
.withSchedule(scheduleBuilder)
.build();
}
}

只要啟動Spring Boot項目,就會輸出:

這是我的 quartz 定時任務
這是我的 quartz 定時任務
這是我的 quartz 定時任務

其他方案

我們在項目,可能會涉及動態調整定時任務執行core表達式、動態關閉開啟定時任務,我們可以使用??SchedulingConfigurer??來實現(使用數據庫結合來搞):

比如:

@Configuration
public class ScheduledConfig implements SchedulingConfigurer {
@Autowired
private ApplicationContext context;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
for (SpringScheduledCron springScheduledCron : cronRepository.findAll()) {
Class<?> clazz;
Object task;
try {
clazz = Class.forName(springScheduledCron.getCronKey());
task = context.getBean(clazz);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("spring_scheduled_cron表數據" + springScheduledCron.getCronKey() + "有誤", e);
} catch (BeansException e) {
throw new IllegalArgumentException(springScheduledCron.getCronKey() + "未納入到spring管理", e);
}
Assert.isAssignable(ScheduledOfTask.class, task.getClass(), "定時任務類必須實現ScheduledOfTask接口");
// 可以通過改變數據庫數據進而實現動態改變執行周期
taskRegistrar.addTriggerTask(((Runnable) task),
triggerContext -> {
//這個可以使用持久層,比如Mybatis來實現,從數據庫中獲取
String cronExpression = "0/10 * * * * ? "
return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);
}
);
}
}
@Bean
public Executor taskExecutor(){
return Executors.newScheduledThreadPool(10);
}
}

如果項目中用得到類似的,可以網上搜搜SchedulingConfigurer便可實現。

進而再擴展,那就來到分布式任務調度了。

什么是分布式任務調度?

任務調度是指基于給定的時間點,給定的時間間隔或者給定執行次數自動得執行任務。任務調度是是操作系統的重要組成部分,而對于實時的操作系統,任務調度直接影響著操作系統的實時性能。任務調度涉及到多線程并發、運行時間規則定制及解析、線程池的維護等諸多方面的工作。

WEB服務器在接受請求時,會創建一個新的線程服務。但是資源有限,必須對資源進行控制,首先就是限制服務線程的最大數目,其次考慮以線程池共享服務的線程資源,降低頻繁創建、銷毀線程的消耗;然后任務調度信息的存儲包括運行次數、調度規則以及運行數據等。一個合適的任務調度框架對于項目的整體性能來說顯得尤為重要。

分布式任務調度框架有:cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job 等。

另外,就是cron表達式,推薦 http://www.pppet.net/

圖片

可以根據自己業務情況來,手動選擇,自動生成表達式。

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2024-07-10 18:55:09

Python定時

2021-12-01 06:50:50

Docker底層原理

2025-03-18 09:20:00

Go語言Golang

2017-09-27 11:00:50

LinuxBash使用技巧

2021-11-22 12:35:40

Python命令定時任務

2024-01-31 08:38:57

Python定時任務函數

2009-11-16 09:53:56

PHP上傳類

2015-12-03 14:10:26

systemd容器Linux

2020-02-21 19:54:09

HTTPS 配置手把手教

2025-05-26 10:25:00

防御性編程開發編程

2020-12-07 09:01:58

冪等系統f(f(x)) =f(

2020-06-16 08:47:53

磁盤

2009-11-16 10:53:30

Oracle Hint

2024-12-11 07:00:00

面向對象代碼

2025-03-13 06:22:59

2023-04-04 09:13:15

2009-10-21 18:19:36

VB.NET實現拖放

2024-06-19 10:41:06

2025-01-21 07:39:04

Linux堆內存Golang

2009-11-17 14:50:50

Oracle調優
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩国产高清 | 一区二区三区亚洲视频 | 欧美美女爱爱 | a在线免费观看视频 | 在线第一页 | 日韩综合在线 | 天天操人人干 | 五月婷婷激情网 | 凹凸日日摸日日碰夜夜 | 欧美日韩综合视频 | 91久久精品一区二区二区 | 国产1区| xnxx 日本免费 | 欧美日韩国产高清 | 先锋影音资源网站 | 日本小电影在线 | www.国产精 | 性欧美精品一区二区三区在线播放 | av黄色在线播放 | 精品1区 | 国产高清视频一区二区 | 国产精品不卡一区 | 日韩欧美一区二区三区四区 | 日韩精品一区二区三区在线观看 | 免费小视频在线观看 | 国产美女在线播放 | 少妇性l交大片免费一 | 99在线精品视频 | 国产日韩精品一区 | 精品美女在线观看视频在线观看 | 日韩高清成人 | 久久成人精品 | 亚洲精品大片 | 亚洲高清视频在线观看 | 精品久久久久久亚洲精品 | av在线免费观看网址 | 日韩精品一区在线观看 | 精品视频免费 | 人人干免费 | 国产精品久久 | 亚洲激情视频在线 |