Java實(shí)現(xiàn)定時(shí)任務(wù)的方法總結(jié)
補(bǔ)充:cron表達(dá)式
秒 分 時(shí) 日期 月份 星期
如果日期有則星期為?
如果星期有則日期為?
基本知識(shí)
調(diào)度器 Scheduler : 運(yùn)行到觸發(fā)時(shí)間點(diǎn)
觸發(fā)器 Trigger : 到達(dá)某一時(shí)間點(diǎn)后觸發(fā)鬧鐘
執(zhí)行器 Executors : 觸發(fā)鬧鐘后執(zhí)行響聲
方式一:使用sleep方法
無(wú)法指定時(shí)間
public class SleepDemo1 { public static void main(String[] args) { Runnable task = new Runnable(){ @Override public void run() { while (true){ System.out.println("hello"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(task); thread.start(); } }
方式二:JDK Timer和TimerTask
因?yàn)榈谝环N的定時(shí)任務(wù)方法
java.util.Timer、java.util.TimerTask 非線程安全
每隔1秒執(zhí)行1次
public class TimerDemo2 { public static void main(String[] args) { TimerTask task = new TimerTask(){ @Override public void run() { System.out.println("hello"); } }; Timer timer = new Timer(); long delay = 1000; long interval = 2000; timer.schedule(task,delay,interval); } }
方式三:JDK ScheduledExecutorService
java.util.concurrent.ScheduledExecutorService
可以使用它創(chuàng)建和執(zhí)行定期執(zhí)行的任務(wù),并且可以控制任務(wù)的執(zhí)行頻率。
使用Executors類的newScheduledThreadPool方法創(chuàng)建了一個(gè)ScheduledExecutorService對(duì)象,并使用該對(duì)象的scheduleAtFixedRate方法將任務(wù)安排在每隔1秒鐘執(zhí)行一次??梢愿鶕?jù)需要更改任務(wù)的執(zhí)行頻率。
public class ScheduleExcutorsDemo3 { public static void main(String[] args) { ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); Runnable task = new Runnable(){ @Override public void run() { System.out.println("hello"); } }; scheduledExecutorService.scheduleAtFixedRate(task,0,1, TimeUnit.SECONDS); } }
方式四: Spring Task 中 的 @Scheduler
可以使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)。該注解可以在Spring項(xiàng)目中使用,以在指定的時(shí)間間隔內(nèi)自動(dòng)調(diào)用指定方法。
每隔1秒鐘打印“hello timer”:
import org.springframework.scheduling.annotation.Scheduled; public class ScheduledAnnotationExample { @Scheduled(fixedRate = 1000) public void printMessage() { System.out.println("hello timer"); } }
方法五、Quartz框架
可以使用Quartz創(chuàng)建簡(jiǎn)單的周期性任務(wù),也可以創(chuàng)建復(fù)雜的作業(yè)調(diào)度,例如每周一次的作業(yè)
1、導(dǎo)入依賴
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>
方式六:XXL-JOB
分布式任務(wù)調(diào)度平臺(tái)
下載代碼:https://gitee.com/xuxueli0323/xxl-job,通過(guò)git clone
將SQL運(yùn)行到navcate中:doc/db/xxx.sql 找到克隆下來(lái)的項(xiàng)目中該目錄下的sql文件 Navicat創(chuàng)建相對(duì)應(yīng)的數(shù)據(jù)庫(kù)
修改admin下的配置文件:郵箱、數(shù)據(jù)庫(kù)連接(jdbc:mysql://localhost:3306/xxl_job?serverTimeZone=Asia/Shanghai)
運(yùn)行啟動(dòng)類
訪問(wèn) http://localhost:8080/xxl-job-admin 默認(rèn)賬戶admn,密碼123456
編寫(xiě)一個(gè)自己的代碼
在頁(yè)面中添加定時(shí)任務(wù)并啟動(dòng)運(yùn)行
運(yùn)行報(bào)錯(cuò):執(zhí)行器地址為空
打開(kāi)頁(yè)面中的執(zhí)行器管理,新增一條
Appname在代碼中springboot項(xiàng)目配置文件下的appname,因?yàn)槭亲詣?dòng)注冊(cè)所以不用添加地址
注意:代碼不止需要運(yùn)行admin的啟動(dòng)類,兩個(gè)都需要運(yùn)行
將xxl-job與springboot項(xiàng)目整合
1、將源代碼中的admin打包 clear - install 然后將jar包復(fù)制到自定義的文件夾中,在該文件夾的目錄下啟動(dòng)
java -jar xxl-job-admin-2.4.1-SNAPSHOT.jar
訪問(wèn):http://localhost:8080/xxl-job-admin/
2、在項(xiàng)目中導(dǎo)入依賴
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version> </dependency>
3、將xxl-job-executor-sample-springboot這個(gè)模塊下的XxlJobConfig復(fù)制一份到springboot的項(xiàng)目中,然后將相關(guān)配置設(shè)置好即可(第4步 復(fù)制粘貼)
4、配置文件(使用application.properties才能正確不能用yml)
#xxljob定時(shí)任務(wù) xxl.job.admin.addresses=http://192.168.129.1:8080/xxl-job-admin ### xxl-job, access token xxl.job.accessToken=default_token ### xxl-job executor appname xxl.job.executor.appname=xxl-job-executor-sample ### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null xxl.job.executor.address= ### xxl-job executor server-info xxl.job.executor.ip= xxl.job.executor.port=9999 ### xxl-job executor log-path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job executor log-retention-days xxl.job.executor.logretentiondays=30
5、編寫(xiě)自己的定時(shí)任務(wù)
@Component public class MyTestHandler extends IJobHandler { @Override @XxlJob(value = "mytest1") public void execute() throws Exception { System.out.println("成功啦"); } }
6、在網(wǎng)頁(yè)中添加定時(shí)任務(wù)執(zhí)行器然后啟動(dòng)
方式七:powerjob
相比于xxl-job更加的復(fù)雜,可以個(gè)性化,每一個(gè)appname達(dá)到了隔離
https://www.yuque.com/powerjob/guidence/bdvp1u#4DTFD
1、從github中下載項(xiàng)目
git clone https://github.com/PowerJob/PowerJob.git
2、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)(對(duì)比xxl-job來(lái)說(shuō)更加的簡(jiǎn)潔,只需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)即可)
CREATE DATABASE IF NOT EXISTS powerjob-daily
DEFAULT CHARSET utf8mb4
3、修改配置文件中修改數(shù)據(jù)庫(kù)的配置
powerjob-server/powerjob-server-starter/application-daliy.properties
jdbc:mysql://localhost:3306/powerjob-daily?serverTimeZone=Asia/Shanghai
4、運(yùn)行serve/starter下的主啟動(dòng)類PowerJobServerApplication
如果運(yùn)行不了,需要使用maven的clear以及install
5、打開(kāi)頁(yè)面
http://localhost:7700/
6、注冊(cè)應(yīng)用
填入powerjob-agent-test(需要與第七步中appname一致)和注冊(cè)密碼
7、編寫(xiě)示例代碼
powerjob-worker-samples/application.properties修改app-name(與第六步一致)
8、編寫(xiě)自己的代碼(建立一個(gè)新的類,繼承想要使用的處理器)然后運(yùn)行主啟動(dòng)類
各個(gè)處理器:https://www.yuque.com/powerjob/guidence/hczm7m
@Slf4j @Component public class TestHandler implements BasicProcessor { @Override public ProcessResult process(TaskContext context) throws Exception { // powerjob在線日志功能,使用該log可以直接在控制臺(tái)查看 OmsLogger omsLogger = context.getOmsLogger(); omsLogger.info("程序正在啟動(dòng),定時(shí)任務(wù)開(kāi)啟:{}",context); return new ProcessResult(true,"成功"); } }
9、進(jìn)入頁(yè)面創(chuàng)建任務(wù)
任務(wù)管理-新建任務(wù)
以上就是Java實(shí)現(xiàn)定時(shí)任務(wù)的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java定時(shí)任務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA的Project無(wú)法正常顯示的問(wèn)題解決
本文主要介紹了IDEA的Project無(wú)法正常顯示的問(wèn)題解決,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Java中try-catch的使用及注意細(xì)節(jié)
現(xiàn)在有很多的語(yǔ)言都支持try-catch,比如常見(jiàn)的就是c++,java等,這篇文章主要給大家介紹了關(guān)于Java中try-catch的使用及注意細(xì)節(jié)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Java基礎(chǔ)教程之類型轉(zhuǎn)換與多態(tài)
這篇文章主要介紹了Java基礎(chǔ)教程之類型轉(zhuǎn)換與多態(tài),本文講解了 基本類型轉(zhuǎn)換、 upcast與多態(tài)、 Object類等內(nèi)容,需要的朋友可以參考下2014-09-09