springtask定时任务
前面已经将数据写入到tb_log表中,需要使用定时任务,将数据进行统计计算,存储到tb_analysis_by_day表中。
开启定时任务:
package com.quwei.manage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@EnableScheduling //开启基于注解的定时任务
public class ManageApplication {
public static void main(String[] args) {
SpringApplication.run(ManageApplication.class, args);
}
}
编写定时任务:
package com.quwei.manage.job;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.quwei.manage.enums.LogTypeEnum;
import com.quwei.manage.pojo.AnalysisByDay;
import com.quwei.manage.pojo.Log;
import com.quwei.manage.pojo.User;
import com.quwei.manage.service.AnalysisService;
import com.quwei.manage.service.LogService;
import com.quwei.manage.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
public class AnalysisJob {
@Autowired
private UserService userService;
@Autowired
private AnalysisService analysisService;
@Autowired
private LogService logService;
// @Scheduled(cron = "0 0/1 * * * *") //每分执行,用于测试
@Scheduled(cron = "0 0/30 * * * *") //每30分钟执行
public void run() {
// Date today = new Date();
// String todayStr = DateUtil.formatDate(today);
//测试
Date today = DateUtil.parse("2020-09-08");
String todayStr = "2020-09-08";
//查询当天的统计对象
AnalysisByDay analysisByDay = analysisService.getOne(Wrappers.<AnalysisByDay>lambdaQuery().eq(AnalysisByDay::getRecordDate, todayStr));
if (analysisByDay == null) {
analysisByDay = new AnalysisByDay();
analysisByDay.setRecordDate(today);
this.analysisService.save(analysisByDay);
}
//查询当日的活跃数
int activeCount = this.logService.count(Wrappers.query(Log.builder().logTime(todayStr).build())
.select("DISTINCT(user_id)"));
if (activeCount > 0) {
analysisByDay.setNumActive(activeCount);
}
//查询用户登录数据
List<Log> logList = this.logService.list(Wrappers.query(Log.builder()
.logTime(todayStr)
.type(LogTypeEnum.LOGIN.getValue())
.build()).select("DISTINCT(user_id)")
);
if (CollUtil.isNotEmpty(logList)) {
//今日登录用户
analysisByDay.setNumLogin(logList.size());
//统计数据归0,重新计算
analysisByDay.setNumRegistered(0);
analysisByDay.setNumRetention1d(0);
List<User> userList = this.userService.list(Wrappers.<User>lambdaQuery().in(User::getId, CollUtil.getFieldValues(logList, "userId")));
for (User user : userList) {
Long days = DateUtil.betweenDay(user.getCreated(), today, true);
if (days == 0) {
//今日注册
analysisByDay.setNumRegistered(analysisByDay.getNumRegistered() + 1);
} else if (days == 1) {
//次日留存
analysisByDay.setNumRetention1d(analysisByDay.getNumRetention1d() + 1);
}
}
}
//更新数据
this.analysisService.updateById(analysisByDay);
}
}
User:
package com.quwei.manage.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends BasePojo {
private Long id;
private String mobile; //手机号
@JsonIgnore
private String password; //密码,json序列化时忽略
}
UserService:
package com.quwei.manage.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.quwei.manage.mapper.UserMapper;
import com.quwei.manage.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class UserService extends ServiceImpl<UserMapper, User> {
}
UserMapper:
package com.quwei.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.quwei.manage.pojo.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
AnalysisService:
package com.quwei.manage.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.quwei.manage.mapper.AnalysisByDayMapper;
import com.quwei.manage.pojo.AnalysisByDay;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class AnalysisService extends ServiceImpl<AnalysisByDayMapper, AnalysisByDay> {
}
AnalysisByDayMapper:
package com.quwei.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.quwei.manage.pojo.AnalysisByDay;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AnalysisByDayMapper extends BaseMapper<AnalysisByDay> {
}
AnalysisByDay:
package com.quwei.manage.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AnalysisByDay extends BasePojo {
private Long id;
/**
* 日期
*/
private Date recordDate;
/**
* 新注册用户数
*/
private Integer numRegistered = 0;
/**
* 活跃用户数
*/
private Integer numActive = 0;
/**
* 登陆次数
*/
private Integer numLogin = 0;
/**
* 次日留存用户数
*/
private Integer numRetention1d = 0;
}