java中實(shí)現(xiàn)一個(gè)定時(shí)任務(wù)的方式
java實(shí)現(xiàn)一個(gè)定時(shí)任務(wù)
需求說明
項(xiàng)目中需要每天定時(shí)更新mysql數(shù)據(jù)到另一個(gè)數(shù)據(jù)庫中,暫定每天中午12:00定時(shí)啟動更新任務(wù)。
實(shí)現(xiàn)方式有三種
第一種
使用javaJDK自帶的timeTask和Calendar實(shí)現(xiàn)定時(shí)任務(wù),這種方式可以設(shè)置延時(shí),執(zhí)行間隔,也能設(shè)置執(zhí)行時(shí)間點(diǎn),我用的就是這種。
//第一種:每天中午12點(diǎn)定時(shí)開啟任務(wù) public static void main(String[] args) { //Calendar這個(gè)技術(shù)也是基于java的線程去做的 //設(shè)置第一次更新的時(shí)間點(diǎn) Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 12);//控制小時(shí) calendar.set(Calendar.MINUTE, 0);//控制分鐘, calendar.set(Calendar.SECOND, 0);//控制秒, //利用java的api Timer來完成一個(gè)定時(shí)任務(wù) Timer timer = new Timer(); TimerTask task=new TimerTask() { @Override public void run() { // 實(shí)現(xiàn)自己的定時(shí)任務(wù)操作 System.out.println("這是一個(gè)定時(shí)任務(wù)!去更新數(shù)據(jù)庫數(shù)據(jù)!"); } }; /* * 從第一次發(fā)布任務(wù)的12:00開始執(zhí)行任務(wù),每隔(1000 * 60 * 60 * 24)天,定時(shí)執(zhí)行 * */ timer.schedule(task, calendar.getTime() , 1000 * 60 * 60 * 24); } //第二種:定時(shí)更新,啟動就開始開啟定時(shí)任務(wù),每隔2秒鐘開啟一次任務(wù) public static void main(String[] args) { TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("定時(shí)任務(wù)啟動" + new Date()); } }; Timer timer = new Timer(); //方法參數(shù),定時(shí)執(zhí)行內(nèi)容,延時(shí)(單位毫秒),執(zhí)行間隔(單位毫秒) timer.schedule(timerTask,100,2000); }
第二種
使用ScheduledExecutorService執(zhí)行定時(shí)任務(wù),這個(gè)也是JDK自帶的,它執(zhí)行的定時(shí)任務(wù)的線程是從線程池中取,任務(wù)是并行進(jìn)行的,互不影響。
/** * 使用ScheduledExecutorService執(zhí)行定時(shí)任務(wù) */ public class get003 { public static void main(String[] args) { ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); //參數(shù);任務(wù)體,首次執(zhí)行的延時(shí)時(shí)間,任務(wù)執(zhí)行的間隔,間隔時(shí)間單位 service.scheduleAtFixedRate(()-> System.out.println("任務(wù)啟動"+new Date()),0,3, TimeUnit.SECONDS); } }
第三種
(推薦)結(jié)合springboot注解實(shí)現(xiàn)定時(shí)任務(wù),新建一個(gè)任務(wù)類,在該類上加上@Component和@EnableScheduling注解,在方法上加上@Scheduled注解,在@Scheduled注解的屬性cron上加上啟動時(shí)間,然后啟動項(xiàng)目,到了任務(wù)啟動時(shí)間就會去執(zhí)行任務(wù)方法。
可以在該類中定義多個(gè)定時(shí)任務(wù),只需要在每個(gè)任務(wù)方法上加上@Scheduled注解即可。
/** * 定時(shí)任務(wù),主類加上@Component和@EnableScheduling注解,在方法上加上@Scheduled注解 * 注意的是,可以加個(gè)開關(guān)來決定任務(wù)是否執(zhí)行 */ @Slf4j @Component @EnableScheduling public class TaskInfo { //從配置文件中讀取開關(guān)的值 @Value("${task.switch.is-open}") private boolean flag; @Scheduled(cron = "${task.corn.task-corn}") public void m1() { //判斷開關(guān)狀態(tài) if (flag){ SimpleDateFormat stf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = stf.format(new Date()); System.out.println("定時(shí)任務(wù)啟動->>" + format); }else { System.out.println("未開啟定時(shí)任務(wù)開關(guān),請重試!"); } } }
@Value
:從配置文件中讀取屬性值cron
:特殊的時(shí)間格式,時(shí)分秒 年月日都是有不同的表達(dá)形式。
這里我設(shè)置了一個(gè)任務(wù)開關(guān),當(dāng)工程部署在多個(gè)服務(wù)器時(shí),如何我想讓某個(gè)時(shí)間點(diǎn)只有一臺機(jī)器在跑定時(shí)任務(wù),我就可以將其他的開關(guān)設(shè)置為false,需要啟動的那臺開關(guān)設(shè)置為true,可以靈活的控制定時(shí)任務(wù)的啟動,配置文件定時(shí)任務(wù)配置如下:
#定時(shí)任務(wù) task: switch: is-open: false #開關(guān) corn: task-corn: 0 48 21 * * ? #定時(shí)任務(wù)時(shí)間格式
2021-08-16 21:47:31.255 INFO 8888 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-08-16 21:47:31.255 INFO 8888 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.38]
2021-08-16 21:47:31.555 INFO 8888 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-08-16 21:47:31.555 INFO 8888 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1174 ms
2021-08-16 21:47:31.956 INFO 8888 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-08-16 21:47:32.104 INFO 8888 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2021-08-16 21:47:32.151 INFO 8888 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-08-16 21:47:32.165 INFO 8888 --- [ main] com.cry.PdosWebApplication : Started PdosWebApplication in 2.181 seconds (JVM running for 3.035)
進(jìn)銷存web啟動成功!
未開啟定時(shí)任務(wù)開關(guān),請重試!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決IDEA修改 .vmoptions 文件后導(dǎo)致無法啟動的問題
這篇文章主要介紹了解決IDEA修改 .vmoptions 文件后導(dǎo)致無法啟動的問題,需要的朋友可以參考下2020-12-12java?random隨機(jī)數(shù)的用法及常見應(yīng)用場景
這篇文章主要給大家介紹了關(guān)于java?random隨機(jī)數(shù)的用法及常見應(yīng)用場景的相關(guān)資料,Java中的Random類是用來生成偽隨機(jī)數(shù)的工具類,它可以用來生成隨機(jī)的整數(shù)、浮點(diǎn)數(shù)和布爾值,需要的朋友可以參考下2023-11-11