springtask定时任务

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值