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<SmUserUnLockTask> 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;
|
}
|
}
|
}
|
}
|