NutzBook - 定期清理未激活用户

NutzBook - 定期清理未激活用户

Tags: Nutz

摘要

NutzBook - 定期清理未激活用户

添加cron任务加载类

新建一个配置文件 custom/cron.properties

# clean non-active user
cron.net.javablog.quartz.job.CleanNonActiveUserJob=0 0/2 * * * ?

格式含义

  • 所有属性cron.开头
  • cron.XXX 其中的XXX是类全名
  • 等号的另外一侧是cron表达式, 从左到右分别是 秒 分 时 日 月 星期 年
  • 这里的cron表达式含义是每2分钟检查一次(按时钟算),是比较频繁,测试ok后将改成1小时一次甚至更久.

添加任务类

package net.javablog.quartz.job;


import net.javablog.bean.User;
import net.javablog.bean.UserProfile;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

@IocBean
public class CleanNonActiveUserJob implements Job {

    private static final Log log = Logs.get();

    @Inject
    protected Dao dao;

    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.debug("clean Non-Active User , start");
        Date deadtime = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L); // 一天, 测试的时候可以改成1小时之类的
        Cnd cnd = Cnd.where("userId", ">", 10).and("createTime", "<", deadtime).and(Cnd.exps("emailChecked", "=", false).or("email", "IS", null));
        int deleted = dao.clear(UserProfile.class, cnd);
        log.debugf("delete %d UserProfile", deleted);

        Sql sql = Sqls.create("delete from $user_table where id > 10 and not exists (select 1 from $user_profile_table where $user_table.id = uid ) and ct < @deadtime");
        sql.vars().set("user_table", dao.getEntity(User.class).getTableName());
        sql.vars().set("user_profile_table", dao.getEntity(UserProfile.class).getTableName());
        sql.params().set("deadtime", deadtime);
        dao.execute(sql);
        log.debugf("delete %d User", sql.getUpdateCount());

        log.debug("clean Non-Active User , Done");
    }

}

在MainSetup中触发

因为NutIoc中的Bean是完全懒加载模式的,不获取就不生成,不初始化,所以,为了触发计划任务的加载,需要获取一次

ioc.get(NutQuartzCronJobFactory.class);

检查效果

把CleanNonActiveUserJob中删除未激活用户的条件改成1分钟内未激活的就删掉。

又因为cron.properties中定义的是2分钟执行一次job。所以2分钟后就会看到有用户被删除了。

重启jetty之后,新增多余10个用户,2分钟后就可以看到如下的日志。