7 changed files with 253 additions and 45 deletions
			
			
		| @ -0,0 +1,126 @@ | |||
| package com.epmet.processor; | |||
| 
 | |||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
| import com.epmet.commons.tools.distributedlock.DistributedLock; | |||
| import com.epmet.commons.tools.exception.ExceptionUtils; | |||
| import com.epmet.commons.tools.redis.RedisUtils; | |||
| import com.epmet.constant.EpidemicConstant; | |||
| import com.epmet.dao.IcSyncJobDao; | |||
| import com.epmet.entity.IcSyncJobEntity; | |||
| import com.epmet.service.DataSyncConfigService; | |||
| import lombok.extern.slf4j.Slf4j; | |||
| import org.redisson.api.RLock; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.scheduling.annotation.Scheduled; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.util.CollectionUtils; | |||
| import org.springframework.util.StringUtils; | |||
| 
 | |||
| import java.util.List; | |||
| import java.util.concurrent.ExecutorService; | |||
| import java.util.concurrent.TimeUnit; | |||
| 
 | |||
| import static com.epmet.constant.EpidemicConstant.JOB_TYPE_NAT; | |||
| 
 | |||
| // 烟台核酸检测数据同步处理器
 | |||
| @Component | |||
| @Slf4j | |||
| public class YanTaiNatSyncProcessor { | |||
| 
 | |||
|     public static final int MAX_EXECUTING_COUNT = 3; | |||
| 
 | |||
|     @Autowired | |||
|     private ExecutorService executorService; | |||
| 
 | |||
|     @Autowired | |||
|     private IcSyncJobDao icSyncJobDao; | |||
| 
 | |||
|     @Autowired | |||
|     private DataSyncConfigService dataSyncConfigService; | |||
| 
 | |||
|     @Autowired | |||
|     private DistributedLock distributedLock; | |||
| 
 | |||
|     @Autowired | |||
|     RedisUtils redisUtils; | |||
| 
 | |||
|     /** | |||
|      * 定时扫描和执行同步任务 | |||
|      * 10s扫一次库 | |||
|      * | |||
|      * @author wxz | |||
|      * @date 2022/11/8 下午5:42 | |||
|      */ | |||
|     @Scheduled(cron = "0/10 * * * * ? ") | |||
|     public void scanJobs() { | |||
|         log.info("【异步数据更新】开始同步任务"); | |||
| 
 | |||
|         String dataSyncEnable = redisUtils.getString("data:sync:enable"); | |||
|         if (StringUtils.isEmpty(dataSyncEnable)) { | |||
|             return; | |||
|         } | |||
| 
 | |||
|         LambdaQueryWrapper<IcSyncJobEntity> executingListQuery = new LambdaQueryWrapper<>(); | |||
|         executingListQuery.eq(IcSyncJobEntity::getOperationStatus, EpidemicConstant.OPERATION_STATUS_PROCESSING); | |||
|         List<IcSyncJobEntity> executingJobList = icSyncJobDao.selectList(executingListQuery); | |||
| 
 | |||
|         if (!CollectionUtils.isEmpty(executingJobList) && executingJobList.size() >= MAX_EXECUTING_COUNT) { | |||
|             // 最多只允许同时3条线程运行
 | |||
|             return; | |||
|         } | |||
| 
 | |||
|         int executingCount = executingJobList.size(); | |||
|         // 还可以运行几条线程
 | |||
|         int leftCount = MAX_EXECUTING_COUNT - executingCount; | |||
| 
 | |||
|         RLock lock = null; | |||
|         try { | |||
|             lock = distributedLock.getLock("data:sync:" + JOB_TYPE_NAT, 60L, 60L, TimeUnit.SECONDS); | |||
|             // 查询可执行的任务列表,并且异步执行
 | |||
|             List<IcSyncJobEntity> icSyncJobToExec = icSyncJobDao.selectExecutableJobList( | |||
|                     EpidemicConstant.JOB_TYPE_NAT, | |||
|                     EpidemicConstant.OPERATION_STATUS_WAITING, | |||
|                     leftCount); | |||
| 
 | |||
|             if (!CollectionUtils.isEmpty(icSyncJobToExec)) { | |||
|                 // 异步提交任务
 | |||
|                 for (IcSyncJobEntity jobEntity : icSyncJobToExec) { | |||
| 
 | |||
|                     updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_PROCESSING); | |||
|                     executorService.submit(() -> { | |||
|                         // 将此任务状态修改为执行中
 | |||
| 
 | |||
|                         dataSyncConfigService.execSyncByJobProcessor(jobEntity); | |||
| 
 | |||
|                         // 更新任务状态为结束
 | |||
|                         updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_FINISH); | |||
|                     }); | |||
|                 } | |||
|             } | |||
|         } catch (Exception e) { | |||
|             log.error("【异步数据更新】出错:{}", ExceptionUtils.getErrorStackTrace(e)); | |||
|         } finally { | |||
|             if (lock != null) { | |||
|                 lock.unlock(); | |||
|             } | |||
|         } | |||
|     } | |||
| 
 | |||
|     /**  | |||
|      * 更新任务状态 | |||
|      * @author wxz | |||
|      * @date 2022/11/8 下午8:25 | |||
|      * @param id  | |||
|  * @param status  | |||
| 
 | |||
|      */ | |||
|     private void updateJobStatus(String id, String status) { | |||
|         LambdaQueryWrapper<IcSyncJobEntity> query = new LambdaQueryWrapper<>(); | |||
|         query.eq(IcSyncJobEntity::getId, id); | |||
| 
 | |||
|         IcSyncJobEntity updateEntity = new IcSyncJobEntity(); | |||
|         updateEntity.setOperationStatus(status); | |||
|         icSyncJobDao.update(updateEntity, query); | |||
|     } | |||
| 
 | |||
| } | |||
					Loading…
					
					
				
		Reference in new issue