Hutool + Cron 实现定时任务

文章介绍了如何利用Hutool工具包中的CronUtil类创建定时任务来实现用户封号和解封功能。当管理员点击封号,用户会被封禁一天并设置一个定时器在一天后自动解封;如果管理员手动解封,则会直接更新数据库并停止定时器。解封用户的方法中包含了数据库更新和定时器的停止。整个流程结合了Spring的@Transactional注解处理数据事务,并使用了缓存清除机制。
摘要由CSDN通过智能技术生成

依赖

<!--hutool工具包--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.14</version> </dependency>

实例

方法参考: https://plus.hutool.cn/docs/#/cron/%E5%85%A8%E5%B1%80%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1-CronUtil?id=%e4%bd%bf%e7%94%a8

主要逻辑

``` // 管理员点击封号按钮

if(用户正常){

封号1天;

设置定时器,1天后解封;

}

if(管理员点击解封){

直接更新数据库,不执行1日后的定时器;

} ```

其中,开启定时器方法为:CronUtil.start();

解封用户的代码为:

``` CronUtil.schedule( EMPLOYEEDISABLELIMIT+"/"+EMPLOYEEDISABLELIMIT+" * * * * ?", (Task) () -> enableUser(id)); }

private void enableUser(Long id){ Long updateId = BaseContext.get(); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(Employee::getId,id); Employee employee = new Employee().setStatus(1).setUpdateUser(updateId); employeeService.update(employee,wrapper); CronUtil.stop(); } `` CronUtil.schedule()`,第一个参数为cron表达式,设置更新频率,第二个参数为每次更新需要做的事情。

关闭定时器的方法为CronUtil.stop();

注:cron可以看作一个循环周期函数,会一直执行下去;若需要中途退出,可使用CronUtil.stop()终止循环。

语法不需要特意学习,有自动生成工具:https://cron.qqe2.com/

# 完整代码

``` //更新员工状态 @ResponseBody @PutMapping("/employee") @SaCheckPermission("admin:addEmployee") @CacheEvict(value={"employeeCache","RoleList","PermissionList"},allEntries = true) @Transactional public Result updateStatus( @RequestBody Employee employee) {

Long id = employee.getId();
RoleMapping roleMapping = new RoleMapping();
//封禁操作
Integer status = employee.getStatus();
if(status!=null){
    //封禁操作
    if(status==0){
        // 先踢下线后封禁
        // 先踢下线
        StpUtil.kickout(id);
        // 再封禁账号
        StpUtil.disable(id,EMPLOYEE_DISABLE_LIMIT);

        CronUtil.start(true);
        //封禁时间到期后解封
        CronUtil.schedule(EMPLOYEE_DISABLE_LIMIT+"/"+EMPLOYEE_DISABLE_LIMIT+" * * * * ?", (Task) () -> enableUser(id));

    }else {
        // 解除封禁
        StpUtil.untieDisable(id);
        CronUtil.stop();
    }
    employee.setStatus(status);

}else{
    Integer isEdit = employee.getIsEdit();
    roleMapping.setRoleId(id);
    roleMapping.setIsEdit(isEdit);

    LambdaQueryWrapper<RoleMapping> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(RoleMapping::getRoleId,id);
    roleMappingService.update(roleMapping,wrapper);

}

//拿新的状态值
log.info("更新的用户信息为:"+employee);
//员工信息更新后,会自动清除缓存
employeeService.updateById(employee);
return Result.success(employee);

}

private void enableUser(Long id){ Long updateId = BaseContext.get();

LambdaUpdateWrapper<Employee> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(Employee::getId,id);
Employee employee = new Employee().setStatus(1).setUpdateUser(updateId);
employeeService.update(employee,wrapper);
CronUtil.stop();

} ```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值