日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java写一个服务定时采集数据_java实现定时任务解决方案

發(fā)布時間:2025/3/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java写一个服务定时采集数据_java实现定时任务解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 總結(jié)常見的實現(xiàn)定時任務(wù)的幾種方法

thread實現(xiàn) 【原理:通過創(chuàng)建一個線程,讓他在while循環(huán)里面一直運(yùn)行,用sleep() 方法讓其休眠從而達(dá)到定時任務(wù)的效果。】

Timer類

ScheduledExcecutorService類

使用spring的 spring-task 實現(xiàn)

Quartz

以下演示幾種實現(xiàn)方式:每隔一秒打印一次hello world

1.1 thread實現(xiàn)

public static void main(String[] args) {

final long timeInterval = 1000;

Runnable runnable = new Runnable() {

@Override

public void run() {

while (true) {

System.out.println("hello world");

try {

Thread.sleep(timeInterval);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

Thread thread = new Thread(runnable);

thread.start();

}

1.2 Timer類實現(xiàn)

Timer是jdk中自帶的一個定時器工具,使用的時候會在主線程之外起一個單獨的線程執(zhí)行指定的計劃任務(wù),可以指定執(zhí)行一次或者反復(fù)執(zhí)行多次。但封裝任務(wù)的類是TimerTask類(實際該類是一個抽象類,執(zhí)行任務(wù)的代碼要放在該類的子類中)。

TimerTask是一個實現(xiàn)了Runnable接口的抽象類,代表一個可以被Timer執(zhí)行的任務(wù)。

構(gòu)造方法:

成員方法:

public static void main(String[] args) {

TimerTask task = new TimerTask() {

@Override

public void run() {

System.out.println("Hello!Word!");

}

};

Timer timer = new Timer();

long delay = 0;

long intevalPeriod = 1 * 1000;

timer.scheduleAtFixedRate(task, delay, intevalPeriod);

}

schedule 與 scheduleAtFixedRate區(qū)別:

schedule會保證任務(wù)的間隔是按照定義的period參數(shù)嚴(yán)格執(zhí)行的,如果某一次調(diào)度時間比較長,那么后面的時間會順延,保證調(diào)度間隔都是period。

scheduleAtFixedRate是嚴(yán)格按照調(diào)度時間來的,如果某次調(diào)度時間太長了,那么會通過縮短間隔的方式保證下一次調(diào)度在預(yù)定時間執(zhí)行。

線程安全, 但只會單線程執(zhí)行, 如果執(zhí)行時間過長, 就錯過下次任務(wù)了, 拋出異常時, timerWork會終止

啟動和取消任務(wù)是可以控制的

1.3 ScheduledExcecutorService類實現(xiàn)

ScheduledExecutorService是JDK1.5以后java.util.concurrent中的一個接口, 用于實現(xiàn)定時任務(wù)。

public static void main(String[] args) {

Runnable r1 = new Runnable() {

public void run() {

System.out.println("Hello Word");

}

};

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

// 第二個參數(shù)為首次執(zhí)行的延時時間,第三個參數(shù)為定時執(zhí)行的間隔時間

service.scheduleAtFixedRate(r1, 3, 1, TimeUnit.SECONDS);// 3秒后開始執(zhí)行

}

他是通過線程池的方式執(zhí)行任務(wù),可以多線程執(zhí)行。

啟動和取消任務(wù)是可以控制的

可以設(shè)定第一次的延遲時間

1.4 使用spring提供的 spring-task 實現(xiàn)

a) 只需要導(dǎo)入web的starter依賴

b) 在啟動類上添加 @EnableScheduling 注解

c) 用 @Scheduled 注解開啟一個定時任務(wù)。

@Component

public class SchedulerTask {

private int count = 0;

/**

* @Author Smith

* @Description 設(shè)置每1秒執(zhí)行一次

* @Date 14:23 2019/1/24

* @Param

* @return void

**/

@Scheduled(cron = "*/1 * * * * ?") // 基于cron表達(dá)式實現(xiàn)

private void process(){

System.out.println("hello world " + (count++));

}

}

@Scheduled 該注解的常用參數(shù)說明【不基于cron表達(dá)式實現(xiàn)的時候】:

fixedRate 表示任務(wù)執(zhí)行之間的時間間隔,具體是指兩次任務(wù)的開始時間間隔,即第二次任務(wù)開始時,第一次任務(wù)可能還沒結(jié)束。

fixedDelay 表示任務(wù)執(zhí)行之間的時間間隔,具體是指本次任務(wù)結(jié)束到下次任務(wù)開始之間的時間間隔。

initialDelay 表示首次任務(wù)啟動的延遲時間。

所有時間的單位都是毫秒。

1.5 Quartz

參考

源碼

Quartz是OpenSymphony開源組織在Job scheduling領(lǐng)域又一個開源項目,它可以與J2EE與J2SE應(yīng)用程序相結(jié)合也可以單獨使用。Quartz可以用來創(chuàng)建簡單或為運(yùn)行十個,百個,甚至是好幾萬個Jobs這樣復(fù)雜的程序。

Quartz默認(rèn)是多線程異步執(zhí)行,單個任務(wù)時,在上一個調(diào)度未完成時,下一個調(diào)度時間到時,會另起一個線程開始新的調(diào)度。

Quartz支持集群定時任務(wù)

Quartz與Spring Task區(qū)別

Quartz默認(rèn)多線程異步執(zhí)行,Task默認(rèn)單線程同步執(zhí)行。

Quartz單個任務(wù)時,在上一個調(diào)度未完成時,下一個調(diào)度時間到時,會另起一個線程開始新的調(diào)度。Task單個任務(wù)時,當(dāng)前次的調(diào)度完成后,再執(zhí)行下一次任務(wù)調(diào)度。

Quartz多個任務(wù)時,任務(wù)之間沒有直接影響,多任務(wù)執(zhí)行的快慢取決于CPU的性能。Task多個任務(wù)時,一個任務(wù)執(zhí)行完成后才會執(zhí)行下一個任務(wù)。若需要任務(wù)能夠并發(fā)執(zhí)行,需手動設(shè)置線程池

Quartz可以采用集群方式,分布式部署到多臺機(jī)器,分配執(zhí)行定時任務(wù)

兩者對比總結(jié):

1、實現(xiàn),Task注解實現(xiàn)方式,比較簡單。Quartz需要手動配置Jobs。

2、任務(wù)執(zhí)行,Task默認(rèn)單線程串行執(zhí)行任務(wù),多任務(wù)時若某個任務(wù)執(zhí)行時間過長,后續(xù)任務(wù)會無法及時執(zhí)行。Quartz采用多線程,無這個問題。

3、調(diào)度,Task采用順序執(zhí)行,若當(dāng)前調(diào)度占用時間過長,下一個調(diào)度無法及時執(zhí)行;

4、Quartz采用異步,下一個調(diào)度時間到達(dá)時,會另一個線程執(zhí)行調(diào)度,不會發(fā)生阻塞問題,但調(diào)度過多時可能導(dǎo)致數(shù)據(jù)處理異常

5、部署,Quartz可以采用集群方式,分布式部署到多臺機(jī)器,分配執(zhí)行定時任務(wù)

Quartz 核心概念:

a) Job 表示一個工作,要執(zhí)行的具體內(nèi)容。此接口中只有一個方法。Task多個任務(wù)時,一個任務(wù)執(zhí)行完成后才會執(zhí)行下一個任務(wù)。若需要任務(wù)能夠并發(fā)執(zhí)行,需手動設(shè)置線程池。

void execute(JobExecutionContext context)

b) JobDetail 表示一個具體的可執(zhí)行的調(diào)度程序,Job 是這個可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容,另外 JobDetail 還包含了這個任務(wù)調(diào)度的方案和策略。

c) Trigger 代表一個調(diào)度參數(shù)的配置,什么時候去調(diào)。

d) Scheduler 代表一個調(diào)度容器,一個調(diào)度容器中可以注冊多個 JobDetail 和 Trigger。當(dāng) Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調(diào)度了。

Spring Boot整合Quartz:

導(dǎo)入Quartz依賴

org.springframework.boot

spring-boot-starter-quartz

編寫任務(wù)類

public class Task implements Job {

// 任務(wù)類不能直接注入Bean,若想注入Bean需要配置第4步

@Autowired

private TestService service;

private void before(){

System.out.println("定時任務(wù)開始");

}

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

service.testDemo();

System.out.println("hello quartz");

}

private void afer(){

System.out.println("定時任務(wù)結(jié)束");

}

}

★ 任務(wù)類不能直接注入Bean,若想注入Bean需要配置第4步 ★

編寫Quartz配置

@Configuration

public class QuartzConfig {

@Bean

public JobDetailFactoryBean jobDetailFactoryBean() {

JobDetailFactoryBean factory = new JobDetailFactoryBean();

//關(guān)聯(lián)我們自己的Job類

factory.setJobClass(Task.class);

return factory;

}

@Bean

public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {

CronTriggerFactoryBean factory = new CronTriggerFactoryBean();

factory.setJobDetail(jobDetailFactoryBean.getObject());

//設(shè)置觸發(fā)時間

factory.setCronExpression("0/2 * * * * ?");

return factory;

}

@Bean

public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory jobFactory) {

SchedulerFactoryBean factory = new SchedulerFactoryBean();

//關(guān)聯(lián)trigger

factory.setTriggers(cronTriggerFactoryBean.getObject());

factory.setJobFactory(jobFactory);

return factory;

}

}

編寫配置【用于任務(wù)類能注入我們的bean】

@Component

public class MyAdaptableJobFactory extends AdaptableJobFactory {

// 可以將一個對象添加到SpringIOC 容器中,并且完成該對象注入

@Autowired

private AutowireCapableBeanFactory autowireCapableBeanFactory;

/**

* 該方法需要將實例化的任務(wù)對象手動的添加到springIOC 容器中并且完成對象的注入

*/

@Override

protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {

Object obj = super.createJobInstance(bundle);

//將obj 對象添加Spring IOC 容器中,并完成注入

this.autowireCapableBeanFactory.autowireBean(obj);

return obj;

}

}

2 Quartz[群集環(huán)境]

使用quartz實現(xiàn)定時任務(wù)[單機(jī)版],若是部署多臺機(jī)器,那么到了時間點,多臺服務(wù)器便會同時均開始執(zhí)行定時任務(wù)。

Quartz是能適用于分布式集群環(huán)境的,在同一時間只會有一臺機(jī)器執(zhí)行定時任務(wù)。

Quartz 中集群如何工作:

一個 Quartz 集群中的每個節(jié)點是一個獨立的 Quartz 應(yīng)用,它又管理著其他的節(jié)點。意思是你必須對每個節(jié)點分別啟動或停止。不像許多應(yīng)用服務(wù)器的集群,獨立的 Quartz 節(jié)點并不與另一其的節(jié)點或是管理節(jié)點通信。Quartz 應(yīng)用是通過數(shù)據(jù)庫表來感知到另一應(yīng)用的。離開了db將無法感知

2.1 導(dǎo)入依賴

org.springframework.boot

spring-boot-starter-quartz

2.2 數(shù)據(jù)庫建表

到官網(wǎng)下載

下載之后解壓,進(jìn)入如下目錄,創(chuàng)建數(shù)據(jù)庫表:

11張表功能說明:

總結(jié)

以上是生活随笔為你收集整理的java写一个服务定时采集数据_java实现定时任务解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美成人 | 亚洲一级黄色片 | 亚洲日本视频在线观看 | 免费在线黄网 | 欧美精品五区 | 少妇特殊按摩高潮惨叫无码 | 亚洲五月婷婷 | 在线永久看片免费的视频 | 已满18岁免费观看电视连续剧 | 日韩免费视频观看 | 在线观看麻豆av | 久久成人在线视频 | 在线观看亚洲区 | 色哟哟入口 | 日韩乱码人妻无码中文字幕久久 | 麻豆影视在线 | 男生插女生的网站 | 国内自拍在线观看 | 亚洲一二三四 | 亚洲欧美国产精品 | 日本不卡视频在线观看 | 国产3级 | 法国空姐电影在线观看 | 亚洲色中色 | 日韩 国产 一区 | 特黄在线 | 免费在线国产视频 | 婷婷影视 | 成人免费网站 | 插插插操操操 | 精品国产97 | 精品欧美一区二区精品少妇 | 香蕉视频亚洲 | 麻豆av在线播放 | 偷拍亚洲欧美 | 永久免费在线看片 | 蜜桃av一区 | 国产欧美在线观看不卡 | 久久久精品欧美 | 男女福利视频 | 国产特级黄色片 | 精东传媒在线观看 | 一级黄色aa | 亚洲精品热 | 韩国中文三级hd字幕 | www.日韩视频 | 午夜天堂精品久久久久 | 99免费在线 | 国产一区亚洲二区 | 最近中文字幕无免费 | 欧美性生活在线视频 | 强行无套内谢大学生初次 | 欧美日韩性生活视频 | 精品日本视频 | 色播综合| 国产三级一区 | 欧美日本在线观看 | 久久影视网 | 久久99久久99精品免观看软件 | 91国偷自产一区二区三区观看 | a级欧美 | 日本xxxwww| 亚洲成人中文字幕 | 天天干天天爽天天操 | 欧美一二三区视频 | 欧美日韩亚洲国产 | 上海毛片 | 成人视品 | 在线日韩中文字幕 | 欧美永久精品 | 欧美日韩国产成人精品 | 轻点好疼好大好爽视频 | 床戏高潮做进去大尺度视频网站 | 国产无套精品 | 成年人三级网站 | 在线看污片 | 超碰香蕉 | 日韩三级国产精品 | 少妇人妻偷人精品无码视频新浪 | 蜜臀av88| 午夜成人亚洲理伦片在线观看 | 五月丁香综合激情六月久久 | 成人免费播放 | 偷拍一区二区三区四区 | 中文字幕日韩欧美一区二区 | 日韩一级视频在线观看 | 93看片淫黄大片一级 | 中文字幕在线播放视频 | 精品免费国产一区二区三区 | av中文天堂| 欧美性xxxx在线播放 | 精品二区视频 | 成人久久毛片 | 久久国产网 | 精品人妻少妇嫩草av无码 | 久久1234 | 亚洲韩国精品 | 国产成人欧美 | 羽月希奶水一区二区三区 |