Spring Task定時(shí)任務(wù)的實(shí)現(xiàn)詳解
Spring Task定時(shí)任務(wù)
Cron表達(dá)式
以6-7位的一組數(shù)字,中間用空格間隔的字符串,表達(dá)一種時(shí)間
每位的含義及取值范圍:
秒(0-59) 分(0-59) 時(shí)(0-23) 日(1-31) 月(1-12) 周(1-7或SUN-SAT) 年(四位數(shù),可省略)
符號(hào)的含義:
*表示所有值(秒位是*,則表示每秒)?表示未說(shuō)明的值,(日和周必須有一位為?,因?yàn)椴缓线壿?-表示一個(gè)指定的范圍,表示一個(gè)可能值/符號(hào)前表示開(kāi)始時(shí)間,符號(hào)后表示每次遞增的值L最后的,在’天’上表示這個(gè)月最后一天,用在’周’上表示’7或SUN’,在周上與數(shù)字一起,如"7L"表示這個(gè)月的最后一個(gè)周六(阿麥利卡日歷,1表示周日)W只能用在’天’上, 用來(lái)描敘最接近指定天的工作日(周一到周五) ,如"15W"指"最近接這個(gè)月第15天的工作日",如果第15天是周六,那么會(huì)在第14天即周五觸發(fā)#只能在’周’上使用,用來(lái)指定這個(gè)月的第幾個(gè)周幾,如’6#3’表示這個(gè)月的第三個(gè)周五(6表示周五,3表示第三周).如果指定日期不存在,那么將不會(huì)觸發(fā)C指和canlendar聯(lián)系后計(jì)算過(guò)的值,如在’天’上標(biāo)注’5C’指這個(gè)月第五天或之后包括canlendar的第一天;在’周’上標(biāo)’1C’指這周日或之后包括calendar的第一天.
當(dāng)然不理解也沒(méi)關(guān)系,網(wǎng)上一搜就有很多Cron表達(dá)式在線(xiàn)生成器
實(shí)現(xiàn)定時(shí)任務(wù)
背景
使用異步進(jìn)行文件上傳,將獲取token文件存到數(shù)據(jù)庫(kù)中,如果用戶(hù)在提交表單之前反復(fù)上傳文件會(huì)產(chǎn)生很多僵尸數(shù)據(jù),需要使用定時(shí)任務(wù)刪除僵尸token字段和上傳到服務(wù)器的圖片
實(shí)現(xiàn)
開(kāi)啟任務(wù)調(diào)度
@EnableScheduling //開(kāi)啟任務(wù)調(diào)度
@SpringBootApplication
public class UploadApplication {
public static void main(String[] args) {
SpringApplication.run(UploadApplication.class, args);
}
}編寫(xiě)清除僵尸token業(yè)務(wù)
//mapper
//獲取僵尸token的id
List<Integer> selectDeadTokens();
//清除僵尸數(shù)據(jù)
int deleteDeadToken(@Param("ids") List<Integer> ids);<delete id="deleteDeadToken">
delete from imagetoken where id in
<foreach collection="ids" item="e" open="(" separator="," close=")">
#{e}
</foreach>
</delete>
<select id="selectDeadTokens" resultType="java.lang.Integer">
SELECT id FROM imagetoken t
WHERE t.token NOT IN (select token FROM good)
</select>//service
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.SERIALIZABLE)
@Override
public void deleteDeadToken() {
System.out.println("---開(kāi)始清除所有僵尸token---");
List<Integer> list = imagetokenMapper.selectDeadTokens();
System.out.println("已找到"+list.size()+"條數(shù)據(jù)");
if (list.size()>0) {
int result = imagetokenMapper.deleteDeadToken(list);
System.out.println("本次刪除"+result+"條數(shù)據(jù)");
}
}查找數(shù)據(jù)庫(kù)中存放文件地址的集合
@Override
public List<String> getList() {
//條件構(gòu)造器 查存放地址
LambdaQueryWrapper<Good> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(Good::getSavepath);
//this指的是當(dāng)前service
List<Good> list = this.list(queryWrapper);
// System.out.println("查詢(xún)到的數(shù)據(jù):");
// System.out.println(list);
//獲取數(shù)據(jù)庫(kù)中所有圖片的絕對(duì)路徑List<String>
ArrayList<String> paths = new ArrayList<>();
//將查到的數(shù)據(jù)中的文件地址遍歷到String類(lèi)型的list中
list.stream().forEach(good -> {
paths.add(good.getSavepath());
});
//System.out.println("查到的路徑:"+paths);
return paths;
}
使用@Scheduled注解開(kāi)啟任務(wù)調(diào)度
@Value("${image.savepath}")
String savePath;
/**
* 每天晚上23點(diǎn)清除無(wú)效token數(shù)據(jù)并刪除圖片
*/
@Scheduled(cron = "0 0 23 * * ?")
public void delete(){
//1.清除無(wú)效token
imagetokenService.deleteDeadToken();
//2.刪除僵尸文件
//2.1獲取數(shù)據(jù)庫(kù)中文件存儲(chǔ)列表
List<String> paths = goodService.getList();
//2.2 獲取圖片存儲(chǔ)地址
File target=new File(savePath);
//2.3遍歷圖片存儲(chǔ)所在文件夾的文件
File[] files=target.listFiles();
for (File file : files) {
if (file.isFile()){
//2.4獲取存儲(chǔ)文件的絕對(duì)地址,需要將盤(pán)符修改,
String absPath = file.getAbsolutePath().replaceAll("\\\\", "/");
//2.5將不存在的文件刪除
if(!paths.contains(absPath)){
//System.out.println("要?jiǎng)h除文件的覺(jué)得路徑:"+absPath);
file.delete();
}
}
}
}到此這篇關(guān)于Spring Task定時(shí)任務(wù)的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Spring定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用spring-task定時(shí)任務(wù)動(dòng)態(tài)配置修改執(zhí)行時(shí)間
- Spring Task定時(shí)任務(wù)每天零點(diǎn)執(zhí)行一次的操作
- SpringBoot整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的流程
- mall整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的方法示例
- java 中Spring task定時(shí)任務(wù)的深入理解
- Spring Task定時(shí)任務(wù)的配置和使用詳解
- spring task 定時(shí)任務(wù)實(shí)現(xiàn)示例
- Spring整合TimerTask實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度
相關(guān)文章
Java中對(duì)null進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的方法
小編對(duì)null進(jìn)行強(qiáng)轉(zhuǎn)會(huì)不會(huì)拋錯(cuò),非常的好奇,下面小編通過(guò)實(shí)例代碼給大家介紹Java中對(duì)null進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的方法,感興趣的朋友參考下吧2018-09-09
Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02
Idea實(shí)現(xiàn)接口的方法上無(wú)法添加@Override注解的解決方案
文章介紹了在IDEA中實(shí)現(xiàn)接口方法時(shí)無(wú)法添加@Override注解的問(wèn)題及其解決方法,主要步驟包括更改項(xiàng)目結(jié)構(gòu)中的Language level到支持該注解的版本,以及在pom.xml文件中指定maven-compiler-plugin的版本以解決自動(dòng)更新后的問(wèn)題2025-02-02
MyBatis 參數(shù)映射機(jī)制實(shí)踐記錄
這篇文章主要介紹了MyBatis 參數(shù)映射機(jī)制實(shí)踐記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-12-12
在Spring Boot中使用swagger-bootstrap-ui的方法
這篇文章主要介紹了在Spring Boot中使用swagger-bootstrap-ui的方法,需要的朋友可以參考下2018-01-01
java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情
這篇文章主要介紹了java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了java 文件鎖的簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07

