|
|
@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.fs.common.constant.Constants;
|
|
|
+import com.fs.common.constant.FsConstants;
|
|
|
import com.fs.common.core.redis.RedisCacheT;
|
|
|
import com.fs.common.utils.PubFun;
|
|
|
import com.fs.common.utils.StringUtils;
|
|
|
@@ -27,14 +28,16 @@ import com.fs.wxcid.service.FriendService;
|
|
|
import com.fs.wxcid.vo.AddContactVo;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.redisson.api.RLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
+import java.util.concurrent.RunnableFuture;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -54,6 +57,8 @@ public class WxTaskService {
|
|
|
private final CompanyVoiceRoboticMapper companyVoiceRoboticMapper;
|
|
|
private final RedisCacheT<String> redisCache;
|
|
|
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+
|
|
|
public void addWx(List<Long> accountIdList) {
|
|
|
log.info("==========执行加微信任务开始==========");
|
|
|
String json = sysConfigService.selectConfigByKey("wx.config");
|
|
|
@@ -206,4 +211,52 @@ public class WxTaskService {
|
|
|
});
|
|
|
log.info("===========CID任务执行完成===========");
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单个任务执行
|
|
|
+ * @param roboticId
|
|
|
+ * @param callerId
|
|
|
+ */
|
|
|
+ public void cellRunOne(Long roboticId,Long callerId){
|
|
|
+ //todo 跑单个任务的下一个任务
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 调用下一个任务
|
|
|
+ */
|
|
|
+ public void callNextTask(){
|
|
|
+ //
|
|
|
+ RLock lock = redissonClient.getLock("CID_CALL_NEXT_TASK");
|
|
|
+ try{
|
|
|
+ lock.lock();
|
|
|
+ long l = System.currentTimeMillis();
|
|
|
+ Collection<String> keys = redisCache.keys(Constants.CID_NEXT_TASK_ID + "*");
|
|
|
+ keys.forEach(key -> {
|
|
|
+ String[] keyArr = key.split(":");
|
|
|
+ String taskId = keyArr[keyArr.length - 2];
|
|
|
+ String callerId = keyArr[keyArr.length - 1];
|
|
|
+ Long runTime =Long.valueOf(redisCache.getCacheObject(key));
|
|
|
+ //到了该执行时间
|
|
|
+ if(runTime.compareTo(l) <= 0){
|
|
|
+ //得到待执行任务
|
|
|
+ CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
|
|
|
+ this.cellRunOne(Long.valueOf(taskId), Long.valueOf(callerId));
|
|
|
+ }).thenRun(() -> {
|
|
|
+ redisCache.deleteObject(key);
|
|
|
+ }).exceptionally(throwable -> {
|
|
|
+ log.error("单项任务执行或删除失败,taskId: {}", taskId, throwable);
|
|
|
+ return null;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ }catch (Exception ex){
|
|
|
+ log.error("CID任务自动调用调用下一个任务失败", ex);
|
|
|
+ } finally {
|
|
|
+ if(lock.isHeldByCurrentThread()){
|
|
|
+ lock.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|