1.在启动类的头部必须加上@EnableScheduling注解,表示开启了定时任务功能。
2.具体实现PV统计更新的代码:
其实这里所谓的更新,无非是重新生成一遍数据对象,再将这个数据对象更新到数据库里。
cron表达式:0/20表示:从0秒开始,每隔20秒重新统计一次。
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
注意:需要有两个类,一个实体类,一个实体详情类(里面包含访问该实体年,月,日,时,分,秒等等信息)
步骤:
1、找资源->res
2、重新生成数据对象(把资源封装成新的资源详情的数据对象)
3、找资源详情->resPv
4、资源详情为空,则添加新数据对象;资源详情不为空,则更新数据对象。
eg.拿某工程的其中一个方法举例:
/**
* 按资源统计
*/
@Scheduled(cron = "0/20 * * * * *")
public void statRes() {
Calendar cal = Calendar.getInstance();
short year = (short) cal.get(Calendar.YEAR);
short month = (short) (cal.get(Calendar.MONTH) + 1);//按老外的逻辑,从零月开始
List<Res> resList = this.resService.query();//找资源
for (Res res : resList) {
int num = (int) this.sitePvService.count(res.getSysId(), year, month, res.getChannelId(),res.getId());
//重新生成数据对象(把资源封装成新的资源详情的数据对象)
StatResPv statResPv = new StatResPv();
statResPv.setNum(num);
statResPv.setSysId(res.getSysId());
statResPv.setYear(year);
statResPv.setMonth(month);
statResPv.setChannelId(res.getChannelId());
statResPv.setResId(res.getId());
StatResPv existStatResPv = this.statResPvService.load(res.getSysId(), year, month, res.getChannelId(), res.getId());//找资源详情
if (null == existStatResPv) {
this.statResPvService.insert(statResPv);//为空,则添加
} else {
statResPv.setId(existStatResPv.getId());
this.statResPvService.update(statResPv);//不为空,则更新
}
}
}
注意:
实时更新PV需要启动类、需要Controller,工程一启动就更新,而定时更新PV统计只需要一个普通的类(加的是@component注解)(在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller对分层中的类进行凝视,而用@Component对那些比较中立的类进行凝视)