在Java Web項(xiàng)目中添加定時(shí)任務(wù)的方法
在Java Web程序中加入定時(shí)任務(wù),這里介紹兩種方式:1.使用監(jiān)聽(tīng)器注入;2.使用Spring注解@Scheduled注入。
推薦使用第二種形式。
一、使用監(jiān)聽(tīng)器注入
①:創(chuàng)建監(jiān)聽(tīng)器類:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TimerDataTaskListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
new TimerManager();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
②:創(chuàng)建定時(shí)任務(wù)類:
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class TimerManager {
//時(shí)間間隔:24h
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
public TimerManager() {
Calendar calendar = Calendar.getInstance();
//定制每日12:30:30執(zhí)行
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 30);
Date date = calendar.getTime(); //第一次執(zhí)行定時(shí)任務(wù)的時(shí)間
//如果當(dāng)前時(shí)間已經(jīng)過(guò)去所定時(shí)的時(shí)間點(diǎn),則在第二天時(shí)間點(diǎn)開(kāi)始執(zhí)行
if (date.before(new Date())) {
date = this.addDay(date, 1);
}
Timer timer = new Timer();
TimerTaskService task = new TimerTaskService();
//安排指定的任務(wù)在指定的時(shí)間開(kāi)始進(jìn)行重復(fù)的固定延遲執(zhí)行。
timer.schedule(task, date, PERIOD_DAY);
}
// 增加或減少天數(shù)
private Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
}
③:創(chuàng)建TimerTask類:
import java.util.TimerTask;
public class TimerTaskService extends TimerTask {
@Override
public void run() {
try {
//要執(zhí)行的任務(wù)邏輯寫(xiě)在這里
System.out.println("插入密碼成功!");
} catch (Exception e) {
System.out.println("插入密碼失??!");
}
}
}
④:在web.xml注冊(cè)監(jiān)聽(tīng)器
<!-- TimerDataTaskListener 監(jiān)聽(tīng)器 --> <listener> <listener-class>com.jsiqi.resume.service.TimerDataTaskListener</listener-class> </listener>
二、使用spring注解注入
我項(xiàng)目的框架是Spring + SpringMVC + Mybatis
代碼示例:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class TimerTask {
@Scheduled(cron="*/30 * * * * *") // 間隔30秒執(zhí)行
public void test(){
try {
//要執(zhí)行的任務(wù)邏輯寫(xiě)在這里
System.out.println("插入密碼成功!");
} catch (Exception e) {
System.out.println("插入密碼失?。?);
}
}
}
關(guān)于定時(shí)時(shí)間的設(shè)置方式如下:
CronTrigger配置完整格式為: [秒] [分] [小時(shí)] [日] [月] [周] [年] 示例: 0 0 10,14,16 * * ? 每天上午10點(diǎn),下午2點(diǎn),4點(diǎn) 0 0/30 9-17 * * ? 朝九晚五工作時(shí)間內(nèi)每半小時(shí) 0 0 12 ? * WED 表示每個(gè)星期三中午12點(diǎn) "0 0 12 * * ?" 每天中午12點(diǎn)觸發(fā) "0 15 10 ? * *" 每天上午10:15觸發(fā) "0 15 10 * * ?" 每天上午10:15觸發(fā) "0 15 10 * * ? *" 每天上午10:15觸發(fā) "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā) "0 * 14 * * ?" 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā) "0 0/5 14 * * ?" 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā) "0 0/5 14,18 * * ?" 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā) "0 0-5 14 * * ?" 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā) "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā) "0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā) "0 15 10 15 * ?" 每月15日上午10:15觸發(fā) "0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā) "0 15 10 ? * 6L" 每月的最后一個(gè)星期五上午10:15觸發(fā) "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā) "0 15 10 ? * 6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)
| 序號(hào) | 說(shuō)明 | 是否必填 | 允許填寫(xiě)的值 | 允許的通配符 |
|---|---|---|---|---|
| 1 | 秒 | 是 | 0-59 | , - * / |
| 2 | 分 | 是 | 0-59 | , - * / |
| 3 | 時(shí) | 是 | 0-23 | , - * / |
| 4 | 日 | 是 | 1-31 | , - * ? / L W |
| 5 | 月 | 是 | 1-12或JAN-DEC | , - * / |
| 6 | 周 | 是 | 1-7或SUN-SAT | , - * ? / L W |
| 7 | 年 | 否 | empty 或1970-2099 | , - * / |
通配符說(shuō)明:
* 表示所有值. 例如:在分的字段上設(shè)置 "*",表示每一分鐘都會(huì)觸發(fā)
? 表示不指定值。使用的場(chǎng)景為不需要關(guān)心當(dāng)前設(shè)置這個(gè)字段的值。
例如:要在每月的10號(hào)觸發(fā)一個(gè)操作,但不關(guān)心是周幾,所以需要周位置的那個(gè)字段設(shè)置為"?" 具體設(shè)置為 0 0 0 10 * ?
- 表示區(qū)間。例如 在小時(shí)上設(shè)置 "10-12",表示 10,11,12點(diǎn)都會(huì)觸發(fā)。
, 表示指定多個(gè)值,例如在周字段上設(shè)置 "MON,WED,FRI" 表示周一,周三和周五觸發(fā)
/ 用于遞增觸發(fā)。如在秒上面設(shè)置"5/15" 表示從5秒開(kāi)始,每增15秒觸發(fā)(5,20,35,50)。 在月字段上設(shè)置'1/3'所示每月1號(hào)開(kāi)始,每隔三天觸發(fā)一次。
L 表示最后的意思。在日字段設(shè)置上,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份,如果是二月還會(huì)依據(jù)是否是潤(rùn)年[leap]), 在周字段上表示星期六,相當(dāng)于"7"或"SAT"。如果在"L"前加上數(shù)字,則表示該數(shù)據(jù)的最后一個(gè)。例如在周字段上設(shè)置"6L"這樣的格式,則表示“本月最后一個(gè)星期五"
W 表示離指定日期的最近那個(gè)工作日(周一至周五). 例如在日字段上設(shè)置"15W",表示離每月15號(hào)最近的那個(gè)工作日觸發(fā)。如果15號(hào)正好是周六,則找最近的周五(14號(hào))觸發(fā), 如果15號(hào)是周未,則找最近的下周一(16號(hào))觸發(fā).如果15號(hào)正好在工作日(周一至周五),則就在該天觸發(fā)。如果指定格式為 "1W",它則表示每月1號(hào)往后最近的工作日觸發(fā)。如果1號(hào)正是周六,則將在3號(hào)下周一觸發(fā)。(注,"W"前只能設(shè)置具體的數(shù)字,不允許區(qū)間"-").
# 序號(hào)(表示每月的第幾個(gè)周幾),例如在周字段上設(shè)置"6#3"表示在每月的第三個(gè)周六.注意如果指定"#5",正好第五周沒(méi)有周六,則不會(huì)觸發(fā)該配置(用在母親節(jié)和父親節(jié)再合適不過(guò)了) ;
小提示:
'L'和 'W'可以組合使用。如果在日字段上設(shè)置"LW",則表示在本月的最后一個(gè)工作日觸發(fā);
周字段的設(shè)置,若使用英文字母是不區(qū)分大小寫(xiě)的,即MON 與mon相同;
參考:
https://www.cnblogs.com/liaojie970/p/5913272.html
http://prisonbreak.iteye.com/blog/2247216
- Java定時(shí)任務(wù)的三種實(shí)現(xiàn)方法
- Java定時(shí)任務(wù)的三種實(shí)現(xiàn)方式
- Quartz實(shí)現(xiàn)JAVA定時(shí)任務(wù)的動(dòng)態(tài)配置的方法
- Java定時(shí)任務(wù):利用java Timer類實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的功能
- Java實(shí)現(xiàn)終止線程池中正在運(yùn)行的定時(shí)任務(wù)
- java定時(shí)任務(wù)Timer和TimerTask使用詳解
- Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
- 最流行的java后臺(tái)框架spring quartz定時(shí)任務(wù)
- java中 spring 定時(shí)任務(wù) 實(shí)現(xiàn)代碼
- java實(shí)現(xiàn)周期性執(zhí)行(定時(shí)任務(wù))
相關(guān)文章
SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印
本文主要介紹了SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟
這篇文章主要介紹了Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Spring Boot 訪問(wèn)安全之認(rèn)證和鑒權(quán)詳解
這篇文章主要介紹了Spring Boot 訪問(wèn)安全之認(rèn)證和鑒權(quán),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
一文簡(jiǎn)介Java中BlockingQueue阻塞隊(duì)列
本文主要介紹了一文簡(jiǎn)介Java中BlockingQueue阻塞隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

