今天要做一个广告位定时上/下线的功能。
想到了要用定时任务定时执行,但是这样只能处理执行定时任务的这个时间点的任务。比如10点执行任务,其它如10:10、10:20、10:30……等等没法正点去执行。
开始是考虑的允许一个时间延迟,打一个时间差:10分钟执行一次,执行当前时间之前10分钟范围内的数据。
比如10点的时候,我执行9:50--10:00的数据。不过感觉太牵强了。
想到了定时发送邮件的功能,所以搜索到了:
https://blog.youkuaiyun.com/y1839/article/details/16986909
public class Test
{
public static void main(String[] args)
{
Calendar calendar = Calendar.getInstance();
/**
* 指定触发的时间 现在指定时间为 2013年10月27号 15点 43 分 1 秒时触发
*/
calendar.set(Calendar.DAY_OF_MONTH,27);//设置日期为27号
calendar.set(Calendar.MONTH, 10);//设置日期为11月份 这里10表示11月份 11就表示12月份
calendar.set(Calendar.HOUR_OF_DAY, 15); //设置15点的时候触发
calendar.set(Calendar.MINUTE, 43); //设置43分钟的时候触发
calendar.set(Calendar.SECOND, 1); //设置第一秒的时候触发
Date time = calendar.getTime();
Timer timer = new Timer();
timer.schedule(new RemindTask(), time);
}
}
class RemindTask extends TimerTask {
public void run() {
System.out.println("你指定2013-11-27号15:34:01分执行已经触发!");
}
}
才知道Timer有这个schedule方法可以用!
代码如下:
1、配置一个定时任务,半点执行
<!-- 定时器开关 -->
<task:annotation-driven /><bean id="bannerTimer" class="com.jkhh.plat.timer.BannerTimer"></bean>
<task:scheduled-tasks>
<task:scheduled ref="bannerTimer" method="updateOffLine" cron="0 30 * * * ?" />
</task:scheduled-tasks>
2、定时任务查询出来此时间点往后一小时内所有需要处理的数据
public class BannerTimer {
@Autowired
private BannerService bannerService;
public void updateOffLine(){
try {
String beginTime = DateUtils.getCurrentDateTime(DateUtils.FORMAT1);
String endTime = DateUtils.dateAdd(4, beginTime, 1);
List<ScrolllBanner> needOffLineList = bannerService.needOffLineList(DateUtils.convertStringToDate(beginTime), DateUtils.convertStringToDate(endTime));
if(null != needOffLineList && needOffLineList.size() > 0){
for(ScrolllBanner banner : needOffLineList){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH,banner.getOfflineTime().getDate());
calendar.set(Calendar.MONTH, banner.getOfflineTime().getMonth());
calendar.set(Calendar.HOUR_OF_DAY, banner.getOfflineTime().getHours());
calendar.set(Calendar.MINUTE, banner.getOfflineTime().getMinutes());
calendar.set(Calendar.SECOND, banner.getOfflineTime().getSeconds());
Date time = calendar.getTime();
Timer timer = new Timer();
timer.schedule(new BannerOffLineTask(banner), time);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、执行任务
public class BannerOffLineTask extends TimerTask {
private ScrolllBanner banner;
/**
* @param banner
*/
public BannerOffLineTask(ScrolllBanner banner) {
this.banner = banner;
}
@Override
public void run() {
BannerDao bannerDao = (BannerDao) SpringBeanUtils.getBean("bannerDao");
System.out.println("你指定的任务执行已经触发!"+banner.getOfflineTime()+" "+banner.getStatus());
bannerDao.offLine(banner);
}
}