Procházet zdrojové kódy

增加分布式定时任务锁,定时任务10线程运行

leon před 5 roky
rodič
revize
a301017e82
34 změnil soubory, kde provedl 323 přidání a 193 odebrání
  1. 14 1
      pom.xml
  2. 28 0
      src/main/java/com/mokamrp/privates/config/ShedLockRedisConfig.java
  3. 2 2
      src/main/java/com/mokamrp/privates/config/TaskConfig.java
  4. 48 6
      src/main/java/com/mokamrp/privates/controller/pangu/CustserviceController.java
  5. 2 16
      src/main/java/com/mokamrp/privates/controller/pangu/PromoteQrcodePoolController.java
  6. 15 0
      src/main/java/com/mokamrp/privates/entity/SetGroundingHandle.java
  7. 1 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/Custservice.java
  8. 1 0
      src/main/java/com/mokamrp/privates/mapper/pangu/pojo/CustserviceVo.java
  9. 3 0
      src/main/java/com/mokamrp/privates/service/pangu/CustserviceService.java
  10. 3 0
      src/main/java/com/mokamrp/privates/service/pangu/PromoteQrcodePoolService.java
  11. 38 1
      src/main/java/com/mokamrp/privates/service/pangu/impl/CustserviceServiceImpl.java
  12. 22 0
      src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteQrcodePoolServiceImpl.java
  13. 3 1
      src/main/java/com/mokamrp/privates/task/ContactJobTask.java
  14. 3 4
      src/main/java/com/mokamrp/privates/task/Datahub/DatahubCorpData.java
  15. 3 6
      src/main/java/com/mokamrp/privates/task/DatahubJobTask.java
  16. 3 2
      src/main/java/com/mokamrp/privates/task/ExportJobTask.java
  17. 3 2
      src/main/java/com/mokamrp/privates/task/SendFrendcircleTask.java
  18. 3 10
      src/main/java/com/mokamrp/privates/task/SynTagTask.java
  19. 3 2
      src/main/java/com/mokamrp/privates/task/WorkEmployeeForbiddenTask.java
  20. 3 2
      src/main/java/com/mokamrp/privates/task/pangu/CheckH5DomainStatus.java
  21. 3 6
      src/main/java/com/mokamrp/privates/task/pangu/CheckWxDomainStatus.java
  22. 3 3
      src/main/java/com/mokamrp/privates/task/pangu/PlaybillQrcodeXYTask.java
  23. 3 8
      src/main/java/com/mokamrp/privates/task/pangu/ResetCustserviceDayViewTask.java
  24. 79 0
      src/main/java/com/mokamrp/privates/task/pangu/ResetCustserviceViewTask.java
  25. 3 1
      src/main/java/com/mokamrp/privates/task/pangu/StationMobileNotice.java
  26. 12 2
      src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxEdit.java
  27. 3 10
      src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxMobile.java
  28. 3 7
      src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxStationEdit.java
  29. 1 23
      src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxTask.java
  30. 3 1
      src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxTaskEdit.java
  31. 3 5
      src/main/java/com/mokamrp/privates/task/pangu/SyncNewFosterwxTask.java
  32. 3 11
      src/main/java/com/mokamrp/privates/task/pangu/UpdatePanguDataTask.java
  33. 3 5
      src/main/java/com/mokamrp/privates/task/produce/ProduceDataHub.java
  34. 0 56
      src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceViewTask.java

+ 14 - 1
pom.xml

@@ -162,7 +162,20 @@
             <artifactId>spring-boot-maven-plugin</artifactId>
             <version>2.5.0</version>
         </dependency>
-
+        <dependency>
+            <groupId>net.javacrumbs.shedlock</groupId>
+            <artifactId>shedlock-spring</artifactId>
+            <version>2.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>net.javacrumbs.shedlock</groupId>
+            <artifactId>shedlock-provider-redis-spring</artifactId>
+            <version>2.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
     </dependencies>
     <profiles>
         <!--        <profile>-->

+ 28 - 0
src/main/java/com/mokamrp/privates/config/ShedLockRedisConfig.java

@@ -0,0 +1,28 @@
+package com.mokamrp.privates.config;
+
+import net.javacrumbs.shedlock.core.LockProvider;
+import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
+import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+
+@Configuration
+//defaultLockAtMostFor 指定在执行节点结束时应保留锁的默认时间使用ISO8601 Duration格式
+//作用就是在被加锁的节点挂了时,无法释放锁,造成其他节点无法进行下一任务
+//这里默认55s
+//关于ISO8601 Duration格式用的不到,具体可上网查询下相关资料,应该就是一套规范,规定一些时间表达方式
+@EnableSchedulerLock(defaultLockAtMostFor = "PT55S")
+public class ShedLockRedisConfig {
+
+    @Value("${spring.profiles.active}")
+    private String env;
+
+    @Bean
+    public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
+        //环境变量 -需要区分不同环境避免冲突,如dev环境和test环境,两者都部署时,只有一个实例进行,此时会造成相关环境未启动情况
+        System.out.println(env);
+        return new RedisLockProvider(connectionFactory, env);
+    }
+}

+ 2 - 2
src/main/java/com/mokamrp/privates/config/TaskConfig.java

@@ -16,8 +16,8 @@ public class TaskConfig {
     @Bean
     public TaskScheduler taskScheduler() {
         ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
-        // 设置scheduler执行线程为3
-        scheduler.setPoolSize(1);
+        // 设置scheduler执行线程为10
+        scheduler.setPoolSize(10);
         return scheduler;
     }
 

+ 48 - 6
src/main/java/com/mokamrp/privates/controller/pangu/CustserviceController.java

@@ -6,13 +6,14 @@ import com.mokamrp.privates.constant.Constants;
 import com.mokamrp.privates.constant.HttpStatus;
 import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.controller.BaseController;
-import com.mokamrp.privates.entity.AddHandle;
-import com.mokamrp.privates.entity.DelHandle;
-import com.mokamrp.privates.entity.EditHandle;
-import com.mokamrp.privates.entity.SetGroupHandle;
+import com.mokamrp.privates.entity.*;
 import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
 import com.mokamrp.privates.help.AjaxResult;
 import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.validation.BindingResult;
@@ -23,9 +24,8 @@ import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 import javax.validation.Valid;
 import java.awt.*;
 import java.time.LocalDateTime;
-import java.util.Date;
+import java.util.*;
 import java.util.List;
-import java.util.Map;
 
 /**
  * <p>
@@ -45,6 +45,12 @@ public class CustserviceController extends BaseController<Custservice> {
     @Autowired
     public StringRedisTemplate stringRedisTemplate;
 
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    @Autowired
+    public PromoteQrcodePoolService promoteQrcodePoolService;
+
     /*
      * @fast
      * 默认生成的控制器所继承的父类中有index/add/edit/del四个基础方法,均为post json请求
@@ -102,6 +108,31 @@ public class CustserviceController extends BaseController<Custservice> {
         }
     }
 
+    @PostMapping("/adds")
+    public Object adds(@Valid @RequestBody AddsHandle<Custservice> addsHandle, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        Map<String, List<Integer>> result = new HashMap<>();
+        List<Integer> successList = new ArrayList<>();
+        List<Integer> errorList = new ArrayList<>();
+        for (Custservice raw : addsHandle.getRaws()) {
+            this.onInsert(raw);
+            Boolean res = service.save(raw);
+            if (res) {
+                successList.add(1);
+                continue;
+            } else {
+                errorList.add(1);
+                continue;
+            }
+        }
+        this.sync();
+        result.put("successList", successList);
+        result.put("errorList", errorList);
+        return AjaxResult.success(result);
+    }
+
     @PostMapping("/edit")
     public Object edit(@Valid @RequestBody EditHandle<Custservice> editHandle, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
@@ -126,6 +157,17 @@ public class CustserviceController extends BaseController<Custservice> {
         return AjaxResult.success(Constants.SUCCESS,true);
     }
 
+
+    //.批量上下架
+    @PostMapping("/setGrounding")
+    public Object setGrounding(@Valid @RequestBody SetGroundingHandle setGroundingHandle, BindingResult bindingResult){
+        if (bindingResult.hasErrors()) {
+            return AjaxResult.error(HttpStatus.ERROR, bindingResult.getFieldError().getDefaultMessage());
+        }
+        Boolean res = custserviceService.setGrounding(setGroundingHandle);
+        return AjaxResult.success(Constants.SUCCESS,true);
+    }
+
     /**
      * 同步到redis
      * @return

+ 2 - 16
src/main/java/com/mokamrp/privates/controller/pangu/PromoteQrcodePoolController.java

@@ -135,7 +135,7 @@ public class PromoteQrcodePoolController extends BaseController<PromoteQrcodePoo
         Boolean res = promoteQrcodePoolService.save(addHandle.getRaw());
         if (res) {
             //.同步到redis
-            this.addRedis(addHandle.getRaw().getPromoteId(), addHandle.getRaw().getCustserviceId(), addHandle.getRaw().getWeight());
+            promoteQrcodePoolService.addRedis(addHandle.getRaw().getPromoteId(), addHandle.getRaw().getCustserviceId(), addHandle.getRaw().getWeight());
             this.sync();
             return AjaxResult.success(Constants.SUCCESS, res);
         } else {
@@ -182,7 +182,7 @@ public class PromoteQrcodePoolController extends BaseController<PromoteQrcodePoo
             Boolean res = promoteQrcodePoolService.save(raw);
             if (res) {
                 //.同步到redis
-                this.addRedis(raw.getPromoteId(), raw.getCustserviceId(), raw.getWeight());
+                promoteQrcodePoolService.addRedis(raw.getPromoteId(), raw.getCustserviceId(), raw.getWeight());
                 this.sync();
                 successList.add(raw.getCustserviceId());
                 continue;
@@ -217,20 +217,6 @@ public class PromoteQrcodePoolController extends BaseController<PromoteQrcodePoo
         return true;
     }
 
-    private Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight) {
-        String scoreStr = BigDecimal.valueOf(weight.doubleValue() / 1000).setScale(4, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString();
-        float score = Float.parseFloat(scoreStr);
-        Long index = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId));
-        if (index == null) {
-            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId), score);
-        }
-        Long indexDay = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdDayView + promoteId, Integer.toString(custserviceId));
-        if (indexDay == null) {
-            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdDayView + promoteId, Integer.toString(custserviceId), score);
-        }
-        return true;
-    }
-
     private Boolean delRedis(String[] qrcodePoolIds) {
         List<PromoteQrcodePool> res = promoteQrcodePoolService.list(new QueryWrapper<PromoteQrcodePool>().in("id", qrcodePoolIds));
         if (res == null) {

+ 15 - 0
src/main/java/com/mokamrp/privates/entity/SetGroundingHandle.java

@@ -0,0 +1,15 @@
+package com.mokamrp.privates.entity;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Data
+public class SetGroundingHandle {
+    @NotNull(message = "上下架开关不可为空")
+    private Integer grounding;
+    @NotEmpty(message = "ids 不可为空")
+    private List<Integer> ids;
+}

+ 1 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/Custservice.java

@@ -26,6 +26,7 @@ public class Custservice extends Model<Custservice> {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    private Integer isGrounding;
     /**
      * 客服组
      */

+ 1 - 0
src/main/java/com/mokamrp/privates/mapper/pangu/pojo/CustserviceVo.java

@@ -26,6 +26,7 @@ public class CustserviceVo extends Model<CustserviceVo> {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    private Integer isGrounding;
     /**
      * 客服组
      */

+ 3 - 0
src/main/java/com/mokamrp/privates/service/pangu/CustserviceService.java

@@ -1,5 +1,6 @@
 package com.mokamrp.privates.service.pangu;
 
+import com.mokamrp.privates.entity.SetGroundingHandle;
 import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
 import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -23,4 +24,6 @@ public interface CustserviceService extends IService<Custservice> {
     public List<CustserviceVo> getAlllist();
     //.按阈值大小获取客服码
     public Map<String,Object> getRandCustservice(String promotePoolKey);
+    //.批量上下架
+    public Boolean setGrounding(SetGroundingHandle setGroundingHandle);
 }

+ 3 - 0
src/main/java/com/mokamrp/privates/service/pangu/PromoteQrcodePoolService.java

@@ -30,4 +30,7 @@ public interface PromoteQrcodePoolService extends IService<PromoteQrcodePool> {
 
     //.设置活码内的客服和海报列表
     public Boolean setPromoteQrcode(SetPromoteQrcodeHandle setPromoteQrcodeHandle);
+
+    //.新增到redis
+    public Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight);
 }

+ 38 - 1
src/main/java/com/mokamrp/privates/service/pangu/impl/CustserviceServiceImpl.java

@@ -1,22 +1,27 @@
 package com.mokamrp.privates.service.pangu.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.mokamrp.privates.cache.RedisCache;
 import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.entity.SetGroundingHandle;
 import com.mokamrp.privates.entity.pangu.CustserviceListHandle;
 import com.mokamrp.privates.mapper.pangu.pojo.Custservice;
 import com.mokamrp.privates.mapper.pangu.CustserviceMapper;
 import com.mokamrp.privates.mapper.pangu.pojo.CustserviceVo;
 import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
 import com.mokamrp.privates.service.pangu.CustserviceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
 import org.omg.CORBA.PUBLIC_MEMBER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.cache.CacheProperties;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -31,7 +36,10 @@ import java.util.*;
 public class CustserviceServiceImpl extends ServiceImpl<CustserviceMapper, Custservice> implements CustserviceService {
 
     @Autowired
-    CustserviceMapper custserviceMapper;
+    public CustserviceMapper custserviceMapper;
+
+    @Autowired
+    public PromoteQrcodePoolService promoteQrcodePoolService;
 
     @Autowired
     public StringRedisTemplate stringRedisTemplate;
@@ -107,4 +115,33 @@ public class CustserviceServiceImpl extends ServiceImpl<CustserviceMapper, Custs
         return res;
     }
 
+    /**
+     * 批量上下架 并且线上REDIS更新
+     * @param setGroundingHandle
+     * @return
+     */
+    public Boolean setGrounding(SetGroundingHandle setGroundingHandle){
+        Custservice custservice  = new Custservice();
+        custservice.setIsGrounding(setGroundingHandle.getGrounding());
+        custservice.setUpdateAt(LocalDateTime.now());
+        this.update(custservice,new QueryWrapper<Custservice>().in("id",setGroundingHandle.getIds()));
+        List<PromoteQrcodePool> promoteQrcodePoolList  = promoteQrcodePoolService.list(
+                new QueryWrapper<PromoteQrcodePool>()
+                        .in("custservice_id",setGroundingHandle.getIds())
+        );
+        if (setGroundingHandle.getGrounding().equals(1)){
+            //.上架
+            for (PromoteQrcodePool promoteQrcodePool : promoteQrcodePoolList){
+                promoteQrcodePoolService.addRedis(promoteQrcodePool.getPromoteId(),promoteQrcodePool.getCustserviceId(),promoteQrcodePool.getWeight());
+            }
+        }else{
+            //.下架
+            for (PromoteQrcodePool promoteQrcodePool : promoteQrcodePoolList){
+                stringRedisTemplate.opsForZSet().remove(RedisKey.PanCustServiceIdView+promoteQrcodePool.getPromoteId(),setGroundingHandle.getIds());
+                stringRedisTemplate.opsForZSet().remove(RedisKey.PanCustServiceIdDayView+promoteQrcodePool.getPromoteId(),setGroundingHandle.getIds());
+            }
+        }
+        return true;
+    }
+
 }

+ 22 - 0
src/main/java/com/mokamrp/privates/service/pangu/impl/PromoteQrcodePoolServiceImpl.java

@@ -3,6 +3,7 @@ package com.mokamrp.privates.service.pangu.impl;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.entity.GetEmployeeTagHandle;
 import com.mokamrp.privates.entity.PostBasePageHandle;
 import com.mokamrp.privates.entity.pangu.GetPromoteQrcodePoolHandle;
@@ -16,9 +17,13 @@ import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolVo;
 import com.mokamrp.privates.service.pangu.PromoteCodeService;
 import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
@@ -41,6 +46,9 @@ public class PromoteQrcodePoolServiceImpl extends ServiceImpl<PromoteQrcodePoolM
     @Autowired
     public PromoteCodeService promoteCodeService;
 
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
     /**
      * 活码内个微海报码列表
      * @param pageHandle
@@ -106,4 +114,18 @@ public class PromoteQrcodePoolServiceImpl extends ServiceImpl<PromoteQrcodePoolM
         PromoteQrcodePoolVo res = list.get(0);
         return res;
     }
+
+    public Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight) {
+        String scoreStr = BigDecimal.valueOf(weight.doubleValue() / 1000).setScale(4, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString();
+        float score = Float.parseFloat(scoreStr);
+        Long index = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId));
+        if (index == null) {
+            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId), score);
+        }
+        Long indexDay = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdDayView + promoteId, Integer.toString(custserviceId));
+        if (indexDay == null) {
+            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdDayView + promoteId, Integer.toString(custserviceId), score);
+        }
+        return true;
+    }
 }

+ 3 - 1
src/main/java/com/mokamrp/privates/tast/ContactJobTask.java → src/main/java/com/mokamrp/privates/task/ContactJobTask.java

@@ -1,6 +1,7 @@
-package com.mokamrp.privates.tast;
+package com.mokamrp.privates.task;
 
 import com.mokamrp.privates.service.WorkContactEmployeeService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -15,6 +16,7 @@ public class ContactJobTask {
      * 导出任务,单进程
      */
     @Scheduled(fixedDelay = 30000)
+    @SchedulerLock(name = "pangu:ContactJobTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         workContactEmployeeService.formatChanelCode();
     }

+ 3 - 4
src/main/java/com/mokamrp/privates/tast/Datahub/DatahubCorpData.java → src/main/java/com/mokamrp/privates/task/Datahub/DatahubCorpData.java

@@ -1,4 +1,4 @@
-package com.mokamrp.privates.tast.Datahub;
+package com.mokamrp.privates.task.Datahub;
 
 import com.aliyun.datahub.client.DatahubClient;
 import com.aliyun.datahub.client.exception.DatahubClientException;
@@ -7,12 +7,10 @@ import com.aliyun.datahub.client.model.RecordEntry;
 import com.aliyun.datahub.client.model.RecordSchema;
 import com.aliyun.datahub.client.model.TupleRecordData;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.mokamrp.privates.entity.JobContactEmployee;
 import com.mokamrp.privates.mapper.pojo.CorpData;
-import com.mokamrp.privates.mapper.vo.WorkContactEmployeeHubVo;
 import com.mokamrp.privates.service.CorpDataService;
-import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.utils.RedisUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -44,6 +42,7 @@ public class DatahubCorpData {
      * 导出任务,单进程
      */
     @Scheduled(fixedDelay = 300000)
+    @SchedulerLock(name = "pangu:DatahubCorpData", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("执行概览数据推送datahub任务,当前时间"+new Date());
 

+ 3 - 6
src/main/java/com/mokamrp/privates/tast/DatahubJobTask.java → src/main/java/com/mokamrp/privates/task/DatahubJobTask.java

@@ -1,4 +1,4 @@
-package com.mokamrp.privates.tast;
+package com.mokamrp.privates.task;
 
 import com.aliyun.datahub.client.DatahubClient;
 import com.aliyun.datahub.client.exception.DatahubClientException;
@@ -6,17 +6,13 @@ import com.aliyun.datahub.client.model.PutRecordsResult;
 import com.aliyun.datahub.client.model.RecordEntry;
 import com.aliyun.datahub.client.model.RecordSchema;
 import com.aliyun.datahub.client.model.TupleRecordData;
-import com.mokamrp.privates.config.DataHubConfiguration;
 import com.mokamrp.privates.entity.JobContactEmployee;
-import com.mokamrp.privates.entity.JobRedis;
-import com.mokamrp.privates.mapper.pojo.Downfile;
 import com.mokamrp.privates.mapper.vo.WorkContactEmployeeHubVo;
 import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.utils.RedisUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Scope;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
@@ -48,6 +44,7 @@ public class DatahubJobTask {
      * 导出任务,单进程
      */
     @Scheduled(fixedDelay = 30000)
+    @SchedulerLock(name = "pangu:DatahubJobTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
 
         System.out.println("执行datahub任务,当前时间"+(new Date())+",当前长度"+redisUtil.lGetListSize(JobContactEmployee.QUEUE_KEY));

+ 3 - 2
src/main/java/com/mokamrp/privates/tast/ExportJobTask.java → src/main/java/com/mokamrp/privates/task/ExportJobTask.java

@@ -1,4 +1,4 @@
-package com.mokamrp.privates.tast;
+package com.mokamrp.privates.task;
 
 import com.mokamrp.privates.entity.JobRedis;
 import com.mokamrp.privates.entity.JobRoomJobRedis;
@@ -10,6 +10,7 @@ import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.service.WorkEmployeeService;
 import com.mokamrp.privates.service.WorkRoomService;
 import com.mokamrp.privates.utils.RedisUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -36,8 +37,8 @@ public class ExportJobTask {
      * 导出任务,单进程
      */
     @Scheduled(fixedDelay = 30000)
+    @SchedulerLock(name = "pangu:ExportJobTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
-
         System.out.println("下载任务执行中,当前时间"+(new Date())+",当前长度"+redisUtil.lGetListSize("java:job:mochat"));
 
         while (redisUtil.lGetListSize(JobRedis.QUEUE_KEY) >=1){

+ 3 - 2
src/main/java/com/mokamrp/privates/tast/SendFrendcircleTask.java → src/main/java/com/mokamrp/privates/task/SendFrendcircleTask.java

@@ -1,12 +1,12 @@
-package com.mokamrp.privates.tast;
+package com.mokamrp.privates.task;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.mapper.pojo.WorkEmployeeFriendcircle;
 import com.mokamrp.privates.mapper.vo.WorkEmployeeFriendcircleVo;
-import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.service.WorkEmployeeFriendcircleService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -28,6 +28,7 @@ public class SendFrendcircleTask {
      * 发送朋友圈任务更新 5分钟
      */
     @Scheduled(fixedDelay = 300 * 1000)
+    @SchedulerLock(name = "pangu:SendFrendcircleTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         List<WorkEmployeeFriendcircleVo> needSendList = workEmployeeFriendcircleService.getNeedSendList();
         for (WorkEmployeeFriendcircleVo workEmployeeFriendcircleVo :needSendList) {

+ 3 - 10
src/main/java/com/mokamrp/privates/tast/SynTagTask.java → src/main/java/com/mokamrp/privates/task/SynTagTask.java

@@ -1,25 +1,17 @@
-package com.mokamrp.privates.tast;
+package com.mokamrp.privates.task;
 
 import com.aliyun.datahub.client.DatahubClient;
-import com.aliyun.datahub.client.exception.DatahubClientException;
-import com.aliyun.datahub.client.model.PutRecordsResult;
-import com.aliyun.datahub.client.model.RecordEntry;
-import com.aliyun.datahub.client.model.RecordSchema;
-import com.aliyun.datahub.client.model.TupleRecordData;
 import com.mokamrp.privates.entity.JobContactEmployee;
-import com.mokamrp.privates.mapper.vo.WorkContactEmployeeHubVo;
 import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.utils.RedisUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 
 @Component
 public class SynTagTask {
@@ -43,6 +35,7 @@ public class SynTagTask {
      * 导出任务,单进程
      */
     @Scheduled(cron="0 20 3,8,10,12,14,16,18 * * *")
+    @SchedulerLock(name = "pangu:SynTagTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("执行typer同步任务,当前时间"+(new Date())+",当前长度"+redisUtil.lGetListSize(JobContactEmployee.QUEUE_KEY));
         workContactEmployeeService.getCronHubPageList();

+ 3 - 2
src/main/java/com/mokamrp/privates/tast/WorkEmployeeForbiddenTask.java → src/main/java/com/mokamrp/privates/task/WorkEmployeeForbiddenTask.java

@@ -1,7 +1,7 @@
-package com.mokamrp.privates.tast;
+package com.mokamrp.privates.task;
 
-import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.service.WorkEmployeeService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -13,6 +13,7 @@ public class WorkEmployeeForbiddenTask {
     private WorkEmployeeService workEmployeeService;
 
     @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    @SchedulerLock(name = "pangu:WorkEmployeeForbiddenTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:客服封禁状态更新任务开始执行");
         workEmployeeService.updateForbbidenStatus();

+ 3 - 2
src/main/java/com/mokamrp/privates/tast/pangu/CheckH5DomainStatus.java → src/main/java/com/mokamrp/privates/task/pangu/CheckH5DomainStatus.java

@@ -1,13 +1,13 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
 import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
 import com.mokamrp.privates.service.pangu.DomainFirstService;
 import com.mokamrp.privates.service.pangu.DomainSecondService;
 import com.mokamrp.privates.utils.Cmd;
 import com.mokamrp.privates.utils.http.HttpUtils;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -26,6 +26,7 @@ public class CheckH5DomainStatus {
     private final String feishu = "https://open.feishu.cn/open-apis/bot/v2/hook/d2b5556d-30fb-400e-b10f-cb9310dbc705";
 
     @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    @SchedulerLock(name = "pangu:CheckH5DomainStatus", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:检测域名备案状态");
         List<DomainFirst> domainFirstList = domainFirstService.list(new QueryWrapper<DomainFirst>().eq("is_record", 1));

+ 3 - 6
src/main/java/com/mokamrp/privates/tast/pangu/CheckWxDomainStatus.java → src/main/java/com/mokamrp/privates/task/pangu/CheckWxDomainStatus.java

@@ -1,7 +1,6 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.constant.RedisKey;
@@ -9,16 +8,13 @@ import com.mokamrp.privates.mapper.pangu.pojo.DomainFirst;
 import com.mokamrp.privates.mapper.pangu.pojo.DomainSecond;
 import com.mokamrp.privates.service.pangu.DomainFirstService;
 import com.mokamrp.privates.service.pangu.DomainSecondService;
-import com.mokamrp.privates.service.pangu.PlaybillService;
-import com.mokamrp.privates.service.pangu.PromoteCodeService;
 import com.mokamrp.privates.utils.Cmd;
 import com.mokamrp.privates.utils.http.HttpResponsePojo;
 import com.mokamrp.privates.utils.http.HttpUtils;
-import lombok.Data;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.cache.CacheProperties;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -59,6 +55,7 @@ public class CheckWxDomainStatus {
     private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
 
     @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    @SchedulerLock(name = "pangu:CheckWxDomainStatus", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:检测域名微信内封禁状态");
         List<DomainFirst> domainFirstList = domainFirstService.list(new QueryWrapper<DomainFirst>().ne("status",3));

+ 3 - 3
src/main/java/com/mokamrp/privates/tast/pangu/PlaybillQrcodeXYTask.java → src/main/java/com/mokamrp/privates/task/pangu/PlaybillQrcodeXYTask.java

@@ -1,12 +1,12 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
-import com.mokamrp.privates.service.WorkEmployeeService;
 import com.mokamrp.privates.service.pangu.PlaybillService;
 import com.mokamrp.privates.utils.http.HttpUtils;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -14,7 +14,6 @@ import org.springframework.stereotype.Component;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 @Component
 public class PlaybillQrcodeXYTask {
@@ -23,6 +22,7 @@ public class PlaybillQrcodeXYTask {
     public PlaybillService playbillService;
 
     @Scheduled(fixedDelay = 300 * 1000) //.间隔 半小时
+    @SchedulerLock(name = "pangu:PlaybillQrcodeXYTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:海报二维码坐标识别任务开始执行");
         List<Playbill> list = playbillService.list(new QueryWrapper<Playbill>().eq("qrcode_x",""));

+ 3 - 8
src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceDayViewTask.java → src/main/java/com/mokamrp/privates/task/pangu/ResetCustserviceDayViewTask.java

@@ -1,16 +1,13 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.constant.RedisKey;
-import com.mokamrp.privates.mapper.pangu.pojo.Playbill;
 import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
 import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
 import com.mokamrp.privates.service.pangu.PlaybillService;
 import com.mokamrp.privates.service.pangu.PromoteCodeService;
 import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
-import com.mokamrp.privates.utils.http.HttpUtils;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -18,10 +15,7 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 @Component
 public class ResetCustserviceDayViewTask {
@@ -39,6 +33,7 @@ public class ResetCustserviceDayViewTask {
     public StringRedisTemplate stringRedisTemplate;
 
     @Scheduled(cron = "0 0 0 * * ?") //.每天0点重置每日个微客服访问量
+    @SchedulerLock(name = "pangu:ResetCustserviceDayViewTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:盘古活码个微每日访问量清空");
         List<PromoteCode> promoteCodeList = promoteCodeService.list();

+ 79 - 0
src/main/java/com/mokamrp/privates/task/pangu/ResetCustserviceViewTask.java

@@ -0,0 +1,79 @@
+package com.mokamrp.privates.task.pangu;
+
+import com.mokamrp.privates.constant.RedisKey;
+import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
+import com.mokamrp.privates.service.pangu.PromoteCodeService;
+import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ZSetOperations;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Component
+public class ResetCustserviceViewTask {
+
+    @Autowired
+    public PromoteCodeService promoteCodeService;
+
+    @Autowired
+    public PromoteQrcodePoolService promoteQrcodePoolService;
+
+    @Autowired
+    public StringRedisTemplate stringRedisTemplate;
+
+    @Scheduled(cron = "* * */1 * * ?") //.每小时重置个微客户访问量
+    @SchedulerLock(name = "pangu:ResetCustserviceViewTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
+    public void execute() {
+        System.out.println("[cronjob]:盘古活码个微每小时访问量清空");
+        List<PromoteCode> promoteCodeList = promoteCodeService.list();
+        for (PromoteCode promoteCode : promoteCodeList) {
+            Set<ZSetOperations.TypedTuple<String>> res = stringRedisTemplate.opsForZSet().rangeByScoreWithScores(RedisKey.PanCustServiceIdView + promoteCode.getId(),-1,99999);
+            List<String> oldList = new ArrayList<>();
+            List<String> newList = new ArrayList<>();
+            for (ZSetOperations.TypedTuple<String> v : res){
+                float score = Float.parseFloat(BigDecimal.valueOf(v.getScore()).setScale(4, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString());
+                if (score >= 1){
+                    //.上一个小时有访问量的,排到后面,让客服码访问量均摊
+                    oldList.add(v.getValue());
+                }else{
+                    //.上一个小时没有访问量的,排在前面
+                    newList.add(v.getValue());
+                }
+            }
+
+            for (String custserviceId : oldList){
+                this.addRedis(promoteCode.getId(),Integer.parseInt(custserviceId),0);
+            }
+            Integer i = newList.size()+1;
+            for (String custserviceId : newList){
+                this.addRedis(promoteCode.getId(),Integer.parseInt(custserviceId),i);
+                i--;
+            }
+
+//            List<PromoteQrcodePool> promoteQrcodePoolList = promoteQrcodePoolService.list(new QueryWrapper<PromoteQrcodePool>().eq("promote_id", promoteCode.getId()));
+//            for (PromoteQrcodePool promoteQrcodePool : promoteQrcodePoolList){
+//                this.addRedis(promoteCode.getId(),promoteQrcodePool.getCustserviceId(),promoteQrcodePool.getWeight());
+//            }
+        }
+    }
+
+    private Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight) {
+        String scoreStr = BigDecimal.valueOf(weight.doubleValue()/1000).setScale(4, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString();
+        float score = Float.parseFloat(scoreStr);
+        Long index = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId));
+        //.redis存在记录时才做更新
+        if (index != null){
+            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId), score);
+            return true;
+        }
+        return false;
+    }
+}

+ 3 - 1
src/main/java/com/mokamrp/privates/tast/pangu/StationMobileNotice.java → src/main/java/com/mokamrp/privates/task/pangu/StationMobileNotice.java

@@ -1,4 +1,4 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.mokamrp.privates.entity.ResHandle;
 import com.mokamrp.privates.entity.pangu.GetForsterwxMobileHandle;
@@ -8,6 +8,7 @@ import com.mokamrp.privates.service.pangu.FosterwxMobileService;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
 import com.mokamrp.privates.utils.Cmd;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -36,6 +37,7 @@ public class StationMobileNotice {
     private String feishu = "https://open.feishu.cn/open-apis/bot/v2/hook/60fa2762-e0a0-4eb8-97ce-8dc0938057de";
 
     @Scheduled(cron = "0 0 9 * * ?")
+    @SchedulerLock(name = "pangu:StationMobileNotice", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:每日站点账号新增统计通知");
         GetForsterwxMobileHandle getForsterwxMobileHandle = new GetForsterwxMobileHandle();

+ 12 - 2
src/main/java/com/mokamrp/privates/tast/pangu/SyncFosterwxEdit.java → src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxEdit.java

@@ -1,4 +1,4 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -11,7 +11,7 @@ import com.mokamrp.privates.service.pangu.FosterwxMobileService;
 import com.mokamrp.privates.service.pangu.FosterwxMobileWxfriendService;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
-import org.apache.tomcat.jni.Local;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -42,6 +42,16 @@ public class SyncFosterwxEdit {
     public List<FosterwxMobileWxfriend> fosterwxMobileWxfriendList;
 
     @Scheduled(cron = "*/1 * * * * ?")
+    /**
+     * lockAtLeastForString的作用是为了防止在任务开始之初由于各个服务器同名任务的服务器时间差,启动时间差等这些造成的一些问题,有了这个时间设置后,
+     *     就可以避免因为上面这些小的时间差造成的一些意外,保证一个线程在抢到锁后,即便很快执行完,也不要立即释放,留下一个缓冲时间。
+     *     这样等多个线程都启动后,由于任务已经被锁定,其他没有获得锁的任务也不会再去抢锁。注意这里的时间不要设置几秒几分钟,尽量大些
+     * lockAtMostForString 这个设置的作用是为了防止抢到锁的那个线程,因为一些意外死掉了,而锁又始终不被释放。
+     *     这样的话,虽然当前执行周期虽然失败了,但以后的执行周期如果这里一直不释放的话,后面就永远执行不到了。
+     *     它的目的不在于隐藏任务,更重要的是,释放锁,并且查找解决问题。
+     *     至于是否带有string后缀,只是2种表达方式,数字类型的就是毫秒数,字符串类型的就有自己固定的格式 ,例如:PT30S  30s时间设置,单位可以是S,M,H
+     */
+    @SchedulerLock(name = "pangu:SyncFosterwxEdit", lockAtLeastForString = "PT1S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:异步执行微信养号账号信息修改/新增操作");
         Integer cnt = 1;

+ 3 - 10
src/main/java/com/mokamrp/privates/tast/pangu/SyncFosterwxMobile.java → src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxMobile.java

@@ -1,27 +1,19 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.constant.RedisKey;
-import com.mokamrp.privates.entity.ResHandle;
-import com.mokamrp.privates.entity.pangu.FosterwxTaskScheduleHandle;
 import com.mokamrp.privates.mapper.pangu.pojo.FosterwxMobile;
 import com.mokamrp.privates.mapper.pangu.pojo.FosterwxMobileWxfriend;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxStation;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxTaskSchedule;
 import com.mokamrp.privates.service.pangu.FosterwxMobileService;
 import com.mokamrp.privates.service.pangu.FosterwxMobileWxfriendService;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
-import org.checkerframework.checker.units.qual.A;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.text.SimpleDateFormat;
 import java.util.*;
 
 @Component
@@ -47,6 +39,7 @@ public class SyncFosterwxMobile {
     public List<FosterwxMobile> fosterwxMobileList;
 
     @Scheduled(cron = "* */1 * * * ?")
+    @SchedulerLock(name = "pangu:SyncFosterwxMobile", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:同步微信养号站点账号到REDIS");
         List<Integer> mobileIds = new ArrayList<>();

+ 3 - 7
src/main/java/com/mokamrp/privates/tast/pangu/SyncFosterwxStationEdit.java → src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxStationEdit.java

@@ -1,25 +1,20 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.constant.RedisKey;
-import com.mokamrp.privates.entity.pangu.AddFosterwxMobileHandle;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxMobile;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxMobileWxfriend;
 import com.mokamrp.privates.mapper.pangu.pojo.FosterwxStation;
 import com.mokamrp.privates.service.pangu.FosterwxMobileService;
 import com.mokamrp.privates.service.pangu.FosterwxMobileWxfriendService;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
 
 @Component
 public class SyncFosterwxStationEdit {
@@ -40,6 +35,7 @@ public class SyncFosterwxStationEdit {
     public StringRedisTemplate stringRedisTemplate;
 
     @Scheduled(cron = "*/1 * * * * ?")
+    @SchedulerLock(name = "pangu:SyncFosterwxStationEdit", lockAtLeastForString = "PT1S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:异步执行微信养号站点信息修改/新增操作");
         Integer cnt = 1;

+ 1 - 23
src/main/java/com/mokamrp/privates/tast/pangu/SyncFosterwxTask.java → src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxTask.java

@@ -1,33 +1,11 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
-import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.mokamrp.privates.constant.RedisKey;
-import com.mokamrp.privates.entity.PostBasePageHandle;
-import com.mokamrp.privates.entity.ResHandle;
-import com.mokamrp.privates.entity.pangu.FosterwxTaskScheduleHandle;
-import com.mokamrp.privates.mapper.data.pojo.PanCSLTRecord;
-import com.mokamrp.privates.mapper.data.pojo.PanCSTQRecord;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxStation;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxTaskSchedule;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolRecord;
-import com.mokamrp.privates.service.data.PanCSLTRecordService;
-import com.mokamrp.privates.service.data.PanCSTQRecordService;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
-import com.mokamrp.privates.service.pangu.PromoteQrcodePoolRecordService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
-import java.util.List;
-
 @Component
 public class SyncFosterwxTask {
 

+ 3 - 1
src/main/java/com/mokamrp/privates/tast/pangu/SyncFosterwxTaskEdit.java → src/main/java/com/mokamrp/privates/task/pangu/SyncFosterwxTaskEdit.java

@@ -1,4 +1,4 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -9,6 +9,7 @@ import com.mokamrp.privates.service.pangu.FosterwxMobileService;
 import com.mokamrp.privates.service.pangu.FosterwxMobileWxfriendService;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -39,6 +40,7 @@ public class SyncFosterwxTaskEdit {
     public SyncNewFosterwxTask syncNewFosterwxTask;
 
     @Scheduled(cron = "*/1 * * * * ?")
+    @SchedulerLock(name = "pangu:SyncFosterwxTaskEdit", lockAtLeastForString = "PT1S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:异步执行微信养号任务信息修改/新增操作");
         Integer cnt = 1;

+ 3 - 5
src/main/java/com/mokamrp/privates/tast/pangu/SyncNewFosterwxTask.java → src/main/java/com/mokamrp/privates/task/pangu/SyncNewFosterwxTask.java

@@ -1,23 +1,20 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.entity.ResHandle;
 import com.mokamrp.privates.entity.pangu.FosterwxTaskScheduleHandle;
-import com.mokamrp.privates.mapper.pangu.pojo.FosterwxMobile;
 import com.mokamrp.privates.mapper.pangu.pojo.FosterwxStation;
 import com.mokamrp.privates.mapper.pangu.pojo.FosterwxTaskSchedule;
 import com.mokamrp.privates.service.pangu.FosterwxStationService;
 import com.mokamrp.privates.service.pangu.FosterwxTaskScheduleService;
-import org.apache.tomcat.jni.Local;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
@@ -35,6 +32,7 @@ public class SyncNewFosterwxTask {
     public StringRedisTemplate stringRedisTemplate;
 
     @Scheduled(cron = "* */1 * * * ?")
+    @SchedulerLock(name = "pangu:SyncNewFosterwxTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:同步微信养号任务到REDIS");
         List<LocalDateTime> dates = new ArrayList<>();

+ 3 - 11
src/main/java/com/mokamrp/privates/tast/pangu/UpdatePanguDataTask.java → src/main/java/com/mokamrp/privates/task/pangu/UpdatePanguDataTask.java

@@ -1,26 +1,17 @@
-package com.mokamrp.privates.tast.pangu;
+package com.mokamrp.privates.task.pangu;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.mokamrp.privates.constant.RedisKey;
 import com.mokamrp.privates.mapper.data.pojo.PanCSLTRecord;
 import com.mokamrp.privates.mapper.data.pojo.PanCSTQRecord;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
 import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePoolRecord;
 import com.mokamrp.privates.service.data.PanCSLTRecordService;
 import com.mokamrp.privates.service.data.PanCSTQRecordService;
-import com.mokamrp.privates.service.pangu.PlaybillService;
-import com.mokamrp.privates.service.pangu.PromoteCodeService;
 import com.mokamrp.privates.service.pangu.PromoteQrcodePoolRecordService;
-import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import javax.sound.sampled.Port;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.List;
 
 @Component
@@ -36,6 +27,7 @@ public class UpdatePanguDataTask {
     public PromoteQrcodePoolRecordService promoteQrcodePoolRecordService;
 
     @Scheduled(cron = "0 */5 * * * ?")
+    @SchedulerLock(name = "pangu:UpdatePanguDataTask", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("[cronjob]:同步盘古个微码每日数据");
         List<PromoteQrcodePoolRecord> promoteQrcodePoolRecordList = promoteQrcodePoolRecordService.list();

+ 3 - 5
src/main/java/com/mokamrp/privates/tast/produce/ProduceDataHub.java → src/main/java/com/mokamrp/privates/task/produce/ProduceDataHub.java

@@ -1,20 +1,17 @@
-package com.mokamrp.privates.tast.produce;
+package com.mokamrp.privates.task.produce;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mokamrp.privates.entity.JobContactEmployee;
-import com.mokamrp.privates.entity.JobRedis;
-import com.mokamrp.privates.entity.JobRoomJobRedis;
 import com.mokamrp.privates.mapper.pojo.Corp;
 import com.mokamrp.privates.service.CorpService;
 import com.mokamrp.privates.service.WorkContactEmployeeService;
 import com.mokamrp.privates.utils.RedisUtil;
-import org.mybatis.spring.annotation.MapperScan;
+import net.javacrumbs.shedlock.core.SchedulerLock;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -35,6 +32,7 @@ public class ProduceDataHub{
      * 导出任务,单进程
      */
     @Scheduled(cron="0 0 3,12,15 * * *")
+    @SchedulerLock(name = "pangu:ProduceDataHub", lockAtLeastForString = "PT5S", lockAtMostForString = "PT15M")
     public void execute() {
         System.out.println("当前时间"+(new Date())+",定时任务推送公司粉丝datahub任务");
         QueryWrapper<Corp> obj= new QueryWrapper<Corp>();

+ 0 - 56
src/main/java/com/mokamrp/privates/tast/pangu/ResetCustserviceViewTask.java

@@ -1,56 +0,0 @@
-package com.mokamrp.privates.tast.pangu;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.mokamrp.privates.constant.RedisKey;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteCode;
-import com.mokamrp.privates.mapper.pangu.pojo.PromoteQrcodePool;
-import com.mokamrp.privates.service.pangu.PlaybillService;
-import com.mokamrp.privates.service.pangu.PromoteCodeService;
-import com.mokamrp.privates.service.pangu.PromoteQrcodePoolService;
-import org.checkerframework.checker.units.qual.A;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-
-@Component
-public class ResetCustserviceViewTask {
-
-    @Autowired
-    public PromoteCodeService promoteCodeService;
-
-    @Autowired
-    public PromoteQrcodePoolService promoteQrcodePoolService;
-
-    @Autowired
-    public StringRedisTemplate stringRedisTemplate;
-
-    @Scheduled(cron = "0 0 */1 * * ?") //.每小时重置个微客户访问量
-    public void execute() {
-        System.out.println("[cronjob]:盘古活码个微每小时访问量清空");
-        List<PromoteCode> promoteCodeList = promoteCodeService.list();
-        for (PromoteCode promoteCode : promoteCodeList) {
-            List<PromoteQrcodePool> promoteQrcodePoolList = promoteQrcodePoolService.list(new QueryWrapper<PromoteQrcodePool>().eq("promote_id", promoteCode.getId()));
-            for (PromoteQrcodePool promoteQrcodePool : promoteQrcodePoolList){
-                this.addRedis(promoteCode.getId(),promoteQrcodePool.getCustserviceId(),promoteQrcodePool.getWeight());
-            }
-        }
-    }
-
-    private Boolean addRedis(Integer promoteId, Integer custserviceId, Integer weight) {
-        String scoreStr = BigDecimal.valueOf(weight.doubleValue()/1000).setScale(4, RoundingMode.HALF_EVEN).stripTrailingZeros().toPlainString();
-        float score = Float.parseFloat(scoreStr);
-        Long index = stringRedisTemplate.opsForZSet().rank(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId));
-        //.redis存在记录时才做更新
-        if (index != null) {
-            stringRedisTemplate.opsForZSet().add(RedisKey.PanCustServiceIdView + promoteId, Integer.toString(custserviceId), score);
-            return true;
-        }
-        return false;
-    }
-
-}