package com.dahuatech.device.module.sync.paas;
import cn.hutool.core.util.StrUtil;
import com.dahuatech.common.util.collection.ListUtils;
import com.dahuatech.common.util.page.PageUtils;
import com.dahuatech.common.util.page.Page;
import com.dahuatech.device.module.sync.paas.enums.BaseErrorCode;
import com.dahuatech.device.module.sync.paas.enums.SyncPaasTaskOperationEnum;
import com.dahuatech.device.module.sync.paas.enums.SyncPaasTaskTypeEnum;
import com.dahuatech.device.module.sync.paas.task.factory.dto.IsSycSearchDto;
import com.dahuatech.device.module.sync.paas.task.process.SyncPaasTaskContext;
import com.dahuatech.device.module.sync.paas.task.process.SyncPaasTaskCreater;
import lombok.extern.log4j.Log4j2;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.util.stream.Collectors.toList;
/**
* 对controller层暴露的异步任务工具类<br>
* 用法:
* 下发任务:对需要设置is_sync的可以先设为1,后放入任务
* Created by 31261 on 2019/6/28.
*/
@Log4j2(topic = "deviceSync")
public class SyncPaasTaskManager {
private static final int DEFAULT_PAGE_SIZE = 1024;
/**
* 全部key的前缀
*/
private static final String ALL_KEY_PREFIX = "vsl:sync:";
/**
* key的拆分字符
*/
private static final String KEY_SPLITER = ":";
private final RedisTemplate redisTemplate;
/**
* 任务生产者
*/
private SyncPaasTaskCreater creater = SyncPaasTaskCreater.instance();
/**
* 任务执行环境
*/
private SyncPaasTaskContext context;
/**
* key缓存
*/
private static Set<String> keyCache = new HashSet<>();
/**
* 初始化方法
* @param nameSpace 命名空间,用于容器内部的初始化队列( vsl:sync: nameSpace :init),
* 执行队列(vsl:sync: nameSpace :process),
* 错误队列名称(vsl:sync: nameSpace :error:map 和 vsl:sync: nameSpace :error:set )
* @param redisTemplate
* @param errorCodes 错误集合
*/
public SyncPaasTaskManager(String nameSpace, RedisTemplate redisTemplate, Collection<BaseErrorCode> errorCodes) {
this.redisTemplate = redisTemplate;
context = new SyncPaasTaskContext(validateKey(nameSpace),redisTemplate,errorCodes);
}
/**
* 验证key是否纯字母且不存在,并生成新的key
* @param key
* @return "vsl:sync: key :"
*/
private static String validateKey(String key) {
if(StrUtil.isBlank(key)){
throw new IllegalArgumentException("key must be all character.");
}
if(keyCache.contains(key)){
throw new IllegalArgumentException("key is exist.");
}
keyCache.add(key);
return ALL_KEY_PREFIX + key + KEY_SPLITER;
}
/**
* 下发paas任务丢到执行队列里,等待执行 <br>
* 需要更改is_sync字段的在调用这个方法前设置
* @param operation
* @param params
*/
public <T> void putTaskInExecuteQueue(SyncPaasTaskTypeEnum syncPaasTaskTypeEnum,
SyncPaasTaskOperationEnum operation, T... params){
context.putTaskInQueue(
creater.createPrepareTask(syncPaasTaskTypeEnum, operation,params));
}