实现定时任务的方法有很多种,@Scheduled注解,scheduleAtFixedRate,timer,quartz等等。
我选择了@Scheduled,相对而言,可以让任务定点执行,并且比较简单。
首先在主类添加注解 @EnableScheduling ,使Scheduled可用。
之后新建一个定时清理类,并实现该类的定时清理方法,在定时清理方法前加上@Scheduled的注解以及corn表达式,corn表达式规定了定时任务的启动时间。以我下文为例,@Scheduled(cron = "0 0 0 * * ?")表示定时任务在每天0点启动,你可以通过 http://cron.qqe2.com/来获取你想要的cron表达式。
以上(加粗&下划线),就是利用@Scheduled实现定时清理任务的方法,很简单吧。如下是我实现的例子,有兴趣可以看一下。
我实现了一个 对于每个No. 如果它在数据库中记录超过50条,那么就进行清理的 定时任务。
首先从表中获取了No.们以及他们出现的次数,由于是使用mybatis进行获取,所以返回了一个map list,对他处理了一下,获得每个No.以及他们出现的次数count,判断若大于50,则清理50以外的部分。
package com.test.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.test.dao.ChangeLogDao;
/**
* 定时清理t_result_log日志
*
*/
@Component
public class TimeCleaning
{
@Autowired
private ChangeLogDao ChangeLogDao;
private static final int MAXCOUNT = 50;
// 每隔一分钟触发
// @Scheduled(cron = "0 0/1 * * * ?")
// 每5秒触发
// @Scheduled(cron = "*/5 * * * * ?")
// 每天零点触发
@Scheduled(cron = "0 0 0 * * ?")
public void timeCleaning()
{
// 获取caseNo-count map
List<Map<String, Object>> NoCountList = ChangeLogDao.getNoCount();
String No = null;
int Count = 0;
for(Map<String, Object> mapListItem:NoCountList)
{
for(Map.Entry<String, Object> entry:mapListItem.entrySet())
{
if ("COUNT1".equals(entry.getKey()))
{
Count = Integer.parseInt(String.valueOf(entry.getValue()));
}
else if ("caseNo".equals(entry.getKey()))
{
No = String.valueOf(entry.getValue());
}
}
if (Count > MAXCOUNT)
{
ChangeLogDao.delResultChangeLog(No, Count - MAXCOUNT);
}
}
}
}
/**
* 获取用No以及他们在result_changelog中次数
*
* @return
*/
public List<Map<String, Object>> getNoCount();
/**
* 定期删除结果变更记录
*
* @auth veast 2018年8月24日
* @param No
* @param deleteCount
*/
public void delResultChangeLog(@Param(value = "No") String No,
@Param(value = "deleteCount") int deleteCount);