java定时任务

场景一、

用户登录时通过oa接口验证是否存在,若存在把用户信息存入redis中,通过定时任务把用户信息保存或更新到用户表中;(还可使用mq队列)

ScheduleService 

/**
 * @Author ChenSir
 * @Date 2023/8/13
 **/
@Component
public class ScheduleService {

    @Autowired
    private IScheduleService scheduleService;

    /**
     * 从redis中获取走oa登录用户信息并保存、修改到数据库  0 0/1 * * * ?
     */
    // 添加定时任务  每10秒执行一次  0/10 * * * * ?
    @Scheduled(cron = "0/10 * * * * ?")
    public void getLoginInfoByRedis(){
        scheduleService.getLoginInfoByRedis();
    }

}

 ScheduleServiceImpl 

/**
 * @Author ChenSir
 * @Date 2023/8/13
 **/
public interface IScheduleService {

    /**
     * 从redis中获取走oa登录用户信息并保存、修改到数据库
     */
    void getLoginInfoByRedis();
}






package com.ict.lux.system.schedule.service.impl;

import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import com.ict.lux.common.encrypt.IEncryptor;
import com.ict.lux.common.exception.PermissionException;
import com.ict.lux.constat.HttpStatus;
import com.ict.lux.core.domain.model.LoginBody;
import com.ict.lux.enmus.EncodeType;
import com.ict.lux.enmus.Gender;
import com.ict.lux.system.domain.entity.SysUser;
import com.ict.lux.system.domain.vo.LoginVo;
import com.ict.lux.system.schedule.service.IScheduleService;
import com.ict.lux.system.service.ISysDeptService;
import com.ict.lux.system.service.ISysUserService;
import com.ict.lux.utils.HttpUtils;
import com.ict.lux.utils.JsonUtils;
import com.ict.lux.utils.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * @Author ChenSir
 * @Date 2023/8/13
 **/
@Service
public class ScheduleServiceImpl implements IScheduleService {

    @Resource
    private ISysUserService userService;

    @Resource
    private ISysDeptService deptService;

    @Value("${userInfo.key}")
    private String redisKey;

    @Value("${oaOld.login.loginUrl}")
    private String oldLoginUrl;

    /**
     * 从redis中获取走oa登录用户信息并保存、修改到数据库
     */
    @Override
    public void getLoginInfoByRedis() {

        Map<String, LoginBody> cacheMap = RedisUtils.getCacheMap(redisKey);

        List<SysUser> insertSysUserList = new ArrayList<>();
        List<SysUser> updateSysUserList = new ArrayList<>();
        List<String> stringList = new ArrayList<>();

        if (cacheMap.size() > 0) {
            cacheMap.values().forEach(loginBody -> {

                byte[] decode = Base64.decode(loginBody.getPassword());
                String decryptPassword = new String(decode, StandardCharsets.UTF_8);
                Map<String, String> parms = new HashMap<>();
                parms.put("account", loginBody.getUsername());
                parms.put("password", decryptPassword);
                String post = HttpUtils.post(oldLoginUrl, parms);
                LoginVo loginVo = JsonUtils.parseObject(post, LoginVo.class);
                if (loginVo.getStatus() == HttpStatus.BAD_REQUEST) {
                  throw new PermissionException("Task oldOaApi err");
                }
                SysUser sysUser = userService.selectUserByUserName(loginBody.getUsername());
                String deptName = loginVo.getData().getDepartment();
                Long deptId = deptService.selectDeptIdByDeptName(deptName);

                if (ObjectUtil.isNotNull(sysUser)) {
                    sysUser.setPassword(BCrypt.hashpw(decryptPassword));
                    if (deptId !=null) {
                        sysUser.setDeptId(deptId);
                    }

                    sysUser.setNickName(loginVo.getData().getName());
                    sysUser.setEmail(loginVo.getData().getEmail());
                    sysUser.setPhonenumber(loginVo.getData().getTel());
                    sysUser.setUpdateBy("Task");
                    sysUser.setUpdateName("Task");
                    updateSysUserList.add(sysUser);
                    stringList.add(loginBody.getUsername());
//                    userService.updateSysUser(sysUser);
//                    RedisUtils.delCacheMapValue(redisKey, loginBody.getUsername());
                } else {
                    SysUser user = new SysUser();
                    user.setUserName(loginBody.getUsername());
                    if (deptId !=null) {
                        user.setDeptId(deptId);
                    }
                    user.setPassword(BCrypt.hashpw(decryptPassword));
                    user.setNickName(loginVo.getData().getName());
                    user.setUserType("sys_user");
                    user.setEmail(loginVo.getData().getEmail());
                    user.setPhonenumber(loginVo.getData().getTel());
                    user.setSex(Gender.fromLabel(loginVo.getData().getGender()).getValue());
                    user.setCreateBy("Task");
                    user.setCreateName("Task");
                    user.setUpdateBy("Task");
                    user.setUpdateName("Task");
                    insertSysUserList.add(user);
                    stringList.add(loginBody.getUsername());
//                    userService.insertUser(user);
//                    RedisUtils.delCacheMapValue(redisKey, loginBody.getUsername());
                }
            });
        }

        if (ObjectUtil.isNotEmpty(updateSysUserList)) {
            userService.updateBatchSysUser(updateSysUserList);
        }
        if (ObjectUtil.isNotEmpty(insertSysUserList)) {
            userService.insertBatchUser(insertSysUserList);
        }
        if (ObjectUtil.isNotEmpty(stringList)) {
            stringList.forEach(key -> {
                RedisUtils.delCacheMapValue(redisKey, key);
            });
        }
    }
}