package com.vci.frameworkcore.ajaxTask; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.util.VciDateUtil; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.concurrent.DelayQueue; import java.util.concurrent.Executors; /** * 解锁的延时任务管理 * @author weidy * @date 2020/2/5 */ @Component public class SmUserUnLockTaskManager{ /** * 日志对象 */ private final Logger logger = LoggerFactory.getLogger(SmUserUnLockTaskManager.class); /** * 延时队列 */ private DelayQueue delayQueue = new DelayQueue<>(); /** * 添加新的任务 * @param task 任务对象 */ public void put(SmUserUnLockTask task){ if(logger.isInfoEnabled()){ logger.info("用户{}在{}时加入解锁队列",task.getUserId(), VciDateUtil.getNowString()); } delayQueue.put(task); } /** * 取消延时任务 * @param userUnLockTask 用户任务 * @return true表示执行成功 */ public boolean remove(SmUserUnLockTask userUnLockTask){ if(logger.isInfoEnabled() && userUnLockTask!=null){ logger.info("取消解锁用户{}",userUnLockTask.getUserId()); } return delayQueue.remove(userUnLockTask); } /** * 任务执行的线程 * @param args 参数 * @throws Exception */ public void run(String... args) throws Exception { Executors.newSingleThreadExecutor().execute(new Thread(this::excuteThread)); } /** * 延时任务执行线程 */ private void excuteThread() { while (true) { try { SmUserUnLockTask task = delayQueue.take(); if(task!=null && StringUtils.isBlank(task.getUserId())){ task.getUserService().unLockUser(task.getUserId()); } } catch (VciBaseException | InterruptedException e) { if(logger.isErrorEnabled()){ logger.error("解锁用户出现了错误",e); } break; } } } }