Browse Source

Merge remote-tracking branch 'origin/dev_compare_data'

dev
zxc 3 years ago
parent
commit
099e18159a
  1. 2
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/yantai/DataSyncUserAndOrgServiceImpl.java
  2. 6
      epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcSyncJobDao.java
  3. 9
      epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSyncJobEntity.java
  4. 213
      epmet-user/epmet-user-server/src/main/java/com/epmet/processor/AbstractDataSyncJobProcessor.java
  5. 119
      epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiNatSyncProcessor.java
  6. 101
      epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiResiComparisonSyncProcessor.java
  7. 107
      epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiVaccineSyncProcessor.java
  8. 19
      epmet-user/epmet-user-server/src/main/resources/db/migration/V0.0.89__data_sync_job_create.sql
  9. 17
      epmet-user/epmet-user-server/src/main/resources/mapper/IcSyncJobDao.xml

2
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/yantai/DataSyncUserAndOrgServiceImpl.java

@ -120,7 +120,7 @@ public class DataSyncUserAndOrgServiceImpl implements DataSyncUserAndOrgService
log.error("未查询到根组织:"+organizationId); log.error("未查询到根组织:"+organizationId);
return true; return true;
} }
rootOrg.setPid(""); rootOrg.setPid(NumConstant.ZERO_STR);
rootOrg.setPids(""); rootOrg.setPids("");
rootOrg.setNameOfOrganization(""); rootOrg.setNameOfOrganization("");
needInsert.add(rootOrg); needInsert.add(rootOrg);

6
epmet-user/epmet-user-server/src/main/java/com/epmet/dao/IcSyncJobDao.java

@ -16,6 +16,8 @@ import java.util.List;
@Mapper @Mapper
public interface IcSyncJobDao extends BaseDao<IcSyncJobEntity> { public interface IcSyncJobDao extends BaseDao<IcSyncJobEntity> {
List<IcSyncJobEntity> selectExecutableJobList(@Param("jobType") String jobType, List<IcSyncJobEntity> selectJobListByStatus(@Param("status") String status,
@Param("itemCount") int itemCount); @Param("jobType") String jobType,
@Param("processorIp") String processorIp,
@Param("itemCount") Integer itemCount);
} }

9
epmet-user/epmet-user-server/src/main/java/com/epmet/entity/IcSyncJobEntity.java

@ -56,4 +56,13 @@ public class IcSyncJobEntity extends BaseEpmetEntity {
*/ */
private String operationStatus; private String operationStatus;
/**
* 处理实例的ip
* @author wxz
* @date 2022/11/19 下午11:02
* * @param null
*
*/
private String processorIp;
} }

213
epmet-user/epmet-user-server/src/main/java/com/epmet/processor/AbstractDataSyncJobProcessor.java

@ -0,0 +1,213 @@
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.constant.EpidemicConstant;
import com.epmet.dao.IcSyncJobDao;
import com.epmet.entity.IcSyncJobEntity;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @ClassName BaseSyncProcessor
* @Description 抽象数据同步处理器基类所有基于该模式的同步器都应当继承该类自定义Scheduler之后调用基类的scanAndExeJobs()方法
* 实现需要实现的方法(定义分布式锁的key定义同步数据的类型)有特殊逻辑的可以重写相关方法
* @Author wangxianzhang
* @Date 2022/11/19 下午11:16
*/
@Slf4j
public abstract class AbstractDataSyncJobProcessor {
@Autowired
private ExecutorService executorService;
@Autowired
private IcSyncJobDao icSyncJobDao;
@Autowired
private DistributedLock distributedLock;
/**
* 最多能运行几条线程如果有特殊情况可以通过抽象方法每个子类单独定义
*/
private int MAX_EXECUTING_NUMBER = 3;
/**
* 本机ip
*/
private String localIp;
{
try {
// 获取本机ip
InetAddress localHost = Inet4Address.getLocalHost();
localIp = localHost.getHostAddress();
log.info("【抽象定时数据同步器】获取本机ip为:{}", localIp);
} catch (UnknownHostException e) {
log.error("【抽象定时数据同步器】获取本机ip失败");
}
}
/**
* 扫描并执行
* @author wxz
* @date 2022/11/20 上午12:10
*
*
*/
void scanAndExecWaitingJobs() {
int executingTaskNumber = getExecutingTaskNumber();
if (executingTaskNumber >= MAX_EXECUTING_NUMBER) {
// 单个实例下,最多只允许同时3条线程运行
return;
}
// 还可以运行几条线程
int leftCount = MAX_EXECUTING_NUMBER - executingTaskNumber;
RLock lock = null;
try {
lock = distributedLock.getLock(getDistributeLockKey(), getDistributeLockLeaseTime(), getDistributeLockWaitTime(), TimeUnit.SECONDS);
// 查询可执行的任务列表,并且异步执行
List<IcSyncJobEntity> icSyncJobToExec = icSyncJobDao.selectJobListByStatus("waiting", getJobType(), null, leftCount);
if (!CollectionUtils.isEmpty(icSyncJobToExec)) {
// 异步提交任务
submitAsyncJob(icSyncJobToExec);
}
} catch (Exception e) {
log.error("【异步数据更新】出错:{}", ExceptionUtils.getErrorStackTrace(e));
} finally {
if (lock != null) {
lock.unlock();
}
}
}
/**
* 扫描并且执行被中断的任务
* @author wxz
* @date 2022/11/20 下午10:29
*
*
*/
@PostConstruct
void scanAndContinueInteruptedJobs() {
// 此处不需要加锁,因为已经按照ip查询了,查到的一定是本机之前执行过的,其他机器查不到该条
List<IcSyncJobEntity> interuptedJobs = icSyncJobDao.selectJobListByStatus("processing", getJobType(), localIp,null);
if (!CollectionUtils.isEmpty(interuptedJobs)) {
submitAsyncJob(interuptedJobs);
}
}
/**
* 提交异步任务
* @author wxz
* @date 2022/11/20 下午10:37
* * @param icSyncJobToExec
*
*/
void submitAsyncJob(List<IcSyncJobEntity> icSyncJobToExec) {
for (IcSyncJobEntity jobEntity : icSyncJobToExec) {
// 将此任务状态修改为执行中
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_PROCESSING, localIp);
executorService.submit(() -> {
try {
execJobTask(jobEntity);
} finally {
// 更新任务状态为结束
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_FINISH, null);
}
});
}
}
/**
* 先检查一下有几个任务需要执行
* @author wxz
* @date 2022/11/19 下午10:57
* @return int
*/
private int getExecutingTaskNumber() {
// 查询本机正在处理中的任务列表
LambdaQueryWrapper<IcSyncJobEntity> executingListQuery = new LambdaQueryWrapper<>();
executingListQuery.eq(IcSyncJobEntity::getOperationStatus, EpidemicConstant.OPERATION_STATUS_PROCESSING);
executingListQuery.eq(IcSyncJobEntity::getProcessorIp, localIp);
return icSyncJobDao.selectCount(executingListQuery);
}
/**
* 更新任务状态
* @author wxz
* @date 2022/11/8 下午8:25
* @param id
* @param status
*/
private void updateJobStatus(String id, String status, String processorIp) {
LambdaQueryWrapper<IcSyncJobEntity> query = new LambdaQueryWrapper<>();
query.eq(IcSyncJobEntity::getId, id);
IcSyncJobEntity updateEntity = new IcSyncJobEntity();
updateEntity.setOperationStatus(status);
updateEntity.setProcessorIp(processorIp);
icSyncJobDao.update(updateEntity, query);
}
/**
* 执行任务
* @author wxz
* @date 2022/11/20 上午12:06
*
*
*/
protected abstract void execJobTask(IcSyncJobEntity jobEntity);
/**
* 获取分布式锁的key
* @author wxz
* @date 2022/11/20 上午12:21
*
*
*/
protected abstract String getDistributeLockKey();
/**
* 任务类型
* @author wxz
* @date 2022/11/20 上午12:25
*
* * @return String
*/
protected abstract String getJobType();
/**
* 分布式锁的续期时间
* @author wxz
* @date 2022/11/20 下午10:52
*
* * @return long
*/
protected abstract long getDistributeLockLeaseTime();
/**
* 分布式锁的等待时间
* @author wxz
* @date 2022/11/20 下午10:52
*
* * @return long
*/
protected abstract long getDistributeLockWaitTime();
}

119
epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiNatSyncProcessor.java

@ -1,49 +1,27 @@
package com.epmet.processor; 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.constant.EpidemicConstant;
import com.epmet.dao.IcSyncJobDao;
import com.epmet.entity.IcSyncJobEntity; import com.epmet.entity.IcSyncJobEntity;
import com.epmet.service.DataSyncConfigService; import com.epmet.service.DataSyncConfigService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; 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; import static com.epmet.constant.EpidemicConstant.JOB_TYPE_NAT;
// 烟台核酸检测数据同步处理器 /**
* @Description 烟台核酸检测数据同步处理器
* @Author wxz
* @Date 2022/11/20 上午11:43
*/
@Component @Component
@Slf4j @Slf4j
public class YanTaiNatSyncProcessor { public class YanTaiNatSyncProcessor extends AbstractDataSyncJobProcessor {
public static final int MAX_EXECUTING_COUNT = 3;
@Autowired
private ExecutorService executorService;
@Autowired
private IcSyncJobDao icSyncJobDao;
@Autowired @Autowired
private DataSyncConfigService dataSyncConfigService; private DataSyncConfigService dataSyncConfigService;
@Autowired
private DistributedLock distributedLock;
@Autowired
RedisUtils redisUtils;
/** /**
* 定时扫描和执行同步任务 * 定时扫描和执行同步任务
* 10s扫一次库 * 10s扫一次库
@ -53,76 +31,31 @@ public class YanTaiNatSyncProcessor {
*/ */
@Scheduled(cron = "0/10 * * * * ? ") @Scheduled(cron = "0/10 * * * * ? ")
public void scanJobs() { public void scanJobs() {
//log.info("【异步数据更新】开始同步任务"); scanAndExecWaitingJobs();
}
//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,
leftCount);
if (!CollectionUtils.isEmpty(icSyncJobToExec)) {
// 异步提交任务
for (IcSyncJobEntity jobEntity : icSyncJobToExec) {
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_PROCESSING);
executorService.submit(() -> {
// 将此任务状态修改为执行中
try {
dataSyncConfigService.execSyncByJobProcessor(jobEntity);
} finally {
// 更新任务状态为结束
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_FINISH);
}
}); @Override
} protected void execJobTask(IcSyncJobEntity jobEntity) {
} dataSyncConfigService.execSyncByJobProcessor(jobEntity);
} catch (Exception e) {
log.error("【异步数据更新】出错:{}", ExceptionUtils.getErrorStackTrace(e));
} finally {
if (lock != null) {
lock.unlock();
}
}
} }
/** @Override
* 更新任务状态 protected String getDistributeLockKey() {
* @author wxz return "data:sync:" + JOB_TYPE_NAT;
* @date 2022/11/8 下午8:25 }
* @param id
* @param status
*/ @Override
private void updateJobStatus(String id, String status) { protected String getJobType() {
LambdaQueryWrapper<IcSyncJobEntity> query = new LambdaQueryWrapper<>(); return EpidemicConstant.JOB_TYPE_NAT;
query.eq(IcSyncJobEntity::getId, id); }
IcSyncJobEntity updateEntity = new IcSyncJobEntity(); @Override
updateEntity.setOperationStatus(status); protected long getDistributeLockLeaseTime() {
icSyncJobDao.update(updateEntity, query); return 60;
} }
@Override
protected long getDistributeLockWaitTime() {
return 60;
}
} }

101
epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiResiComparisonSyncProcessor.java

@ -1,23 +1,13 @@
package com.epmet.processor; 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.commons.tools.redis.RedisUtils;
import com.epmet.constant.EpidemicConstant; import com.epmet.constant.EpidemicConstant;
import com.epmet.dao.IcSyncJobDao;
import com.epmet.entity.IcSyncJobEntity; import com.epmet.entity.IcSyncJobEntity;
import com.epmet.service.IcResiComparisonRecordService; import com.epmet.service.IcResiComparisonRecordService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
/** /**
* @Description 居民一致性对比任务处理器 * @Description 居民一致性对比任务处理器
@ -26,22 +16,11 @@ import java.util.concurrent.TimeUnit;
*/ */
@Component @Component
@Slf4j @Slf4j
public class YanTaiResiComparisonSyncProcessor { public class YanTaiResiComparisonSyncProcessor extends AbstractDataSyncJobProcessor {
public static final int MAX_EXECUTING_COUNT = 3;
@Autowired
private ExecutorService executorService;
@Autowired
private IcSyncJobDao icSyncJobDao;
@Autowired @Autowired
private IcResiComparisonRecordService icResiComparisonRecordService; private IcResiComparisonRecordService icResiComparisonRecordService;
@Autowired
private DistributedLock distributedLock;
@Autowired @Autowired
RedisUtils redisUtils; RedisUtils redisUtils;
@ -51,69 +30,31 @@ public class YanTaiResiComparisonSyncProcessor {
*/ */
@Scheduled(cron = "0/10 * * * * ? ") @Scheduled(cron = "0/10 * * * * ? ")
public void scanJobs() { public void scanJobs() {
//log.info("【异步数据更新】开始同步任务"); scanAndExecWaitingJobs();
}
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:comparison:resi", 60L, 60L, TimeUnit.SECONDS);
// 查询可执行的任务列表,并且异步执行
List<IcSyncJobEntity> icSyncJobToExec = icSyncJobDao.selectExecutableJobList(
EpidemicConstant.JOB_TYPE_COMPARISON_RESI,
leftCount);
if (!CollectionUtils.isEmpty(icSyncJobToExec)) {
// 异步提交任务
for (IcSyncJobEntity jobEntity : icSyncJobToExec) {
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_PROCESSING);
executorService.submit(() -> {
// 将此任务状态修改为执行中
try {
icResiComparisonRecordService.comparisonUserData(jobEntity);
} finally {
// 更新任务状态为结束
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_FINISH);
}
}); @Override
} protected void execJobTask(IcSyncJobEntity jobEntity) {
} icResiComparisonRecordService.comparisonUserData(jobEntity);
} catch (Exception e) {
log.error("【异步数据更新】出错:{}", ExceptionUtils.getErrorStackTrace(e));
} finally {
if (lock != null) {
lock.unlock();
}
}
} }
/** @Override
* 更新任务状态 protected String getDistributeLockKey() {
* @param id return "data:sync:comparison:resi";
* @param status }
*/ @Override
private void updateJobStatus(String id, String status) { protected String getJobType() {
LambdaQueryWrapper<IcSyncJobEntity> query = new LambdaQueryWrapper<>(); return EpidemicConstant.JOB_TYPE_COMPARISON_RESI;
query.eq(IcSyncJobEntity::getId, id); }
IcSyncJobEntity updateEntity = new IcSyncJobEntity(); @Override
updateEntity.setOperationStatus(status); protected long getDistributeLockLeaseTime() {
icSyncJobDao.update(updateEntity, query); return 60;
} }
@Override
protected long getDistributeLockWaitTime() {
return 60;
}
} }

107
epmet-user/epmet-user-server/src/main/java/com/epmet/processor/YanTaiVaccineSyncProcessor.java

@ -1,49 +1,27 @@
package com.epmet.processor; 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.constant.EpidemicConstant;
import com.epmet.dao.IcSyncJobDao;
import com.epmet.entity.IcSyncJobEntity; import com.epmet.entity.IcSyncJobEntity;
import com.epmet.service.DataSyncConfigService; import com.epmet.service.DataSyncConfigService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import static com.epmet.constant.EpidemicConstant.JOB_TYPE_NAT;
import static com.epmet.constant.EpidemicConstant.JOB_TYPE_VACCINE; import static com.epmet.constant.EpidemicConstant.JOB_TYPE_VACCINE;
// 烟台核酸检测数据同步处理器 /**
* @Description 烟台核酸检测数据同步处理器
* @Author wxz
* @Date 2022/11/20 上午11:55
*/
@Component @Component
@Slf4j @Slf4j
public class YanTaiVaccineSyncProcessor { public class YanTaiVaccineSyncProcessor extends AbstractDataSyncJobProcessor {
public static final int MAX_EXECUTING_COUNT = 3;
@Autowired
private ExecutorService executorService;
@Autowired
private IcSyncJobDao icSyncJobDao;
@Autowired @Autowired
private DataSyncConfigService dataSyncConfigService; private DataSyncConfigService dataSyncConfigService;
@Autowired
private DistributedLock distributedLock;
@Autowired
RedisUtils redisUtils;
/** /**
* @Description 定时扫描和执行同步任务疫苗接种 * @Description 定时扫描和执行同步任务疫苗接种
* @Author zxc * @Author zxc
@ -51,62 +29,31 @@ public class YanTaiVaccineSyncProcessor {
*/ */
@Scheduled(cron = "0/10 * * * * ? ") @Scheduled(cron = "0/10 * * * * ? ")
public void scanJobs() { public void scanJobs() {
LambdaQueryWrapper<IcSyncJobEntity> executingListQuery = new LambdaQueryWrapper<>(); scanAndExecWaitingJobs();
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_VACCINE, 60L, 60L, TimeUnit.SECONDS);
// 查询可执行的任务列表,并且异步执行
List<IcSyncJobEntity> icSyncJobToExec = icSyncJobDao.selectExecutableJobList(
EpidemicConstant.JOB_TYPE_VACCINE,
leftCount);
if (!CollectionUtils.isEmpty(icSyncJobToExec)) {
// 异步提交任务
for (IcSyncJobEntity jobEntity : icSyncJobToExec) {
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_PROCESSING);
executorService.submit(() -> {
// 将此任务状态修改为执行中
try {
dataSyncConfigService.execSyncByJobProcessor(jobEntity);
} finally {
// 更新任务状态为结束
updateJobStatus(jobEntity.getId(), EpidemicConstant.OPERATION_STATUS_FINISH);
}
});
}
}
} catch (Exception e) {
log.error("【异步数据更新】出错:{}", ExceptionUtils.getErrorStackTrace(e));
} finally {
if (lock != null) {
lock.unlock();
}
}
} }
/** @Override
* 更新任务状态 protected void execJobTask(IcSyncJobEntity jobEntity) {
* @author wxz dataSyncConfigService.execSyncByJobProcessor(jobEntity);
* @date 2022/11/8 下午8:25 }
* @param id
* @param status
*/ @Override
private void updateJobStatus(String id, String status) { protected String getDistributeLockKey() {
LambdaQueryWrapper<IcSyncJobEntity> query = new LambdaQueryWrapper<>(); return "data:sync:" + JOB_TYPE_VACCINE;
query.eq(IcSyncJobEntity::getId, id); }
@Override
protected String getJobType() {
return EpidemicConstant.JOB_TYPE_VACCINE;
}
IcSyncJobEntity updateEntity = new IcSyncJobEntity(); @Override
updateEntity.setOperationStatus(status); protected long getDistributeLockLeaseTime() {
icSyncJobDao.update(updateEntity, query); return 60;
} }
@Override
protected long getDistributeLockWaitTime() {
return 60;
}
} }

19
epmet-user/epmet-user-server/src/main/resources/db/migration/V0.0.89__data_sync_job_create.sql

@ -0,0 +1,19 @@
CREATE TABLE `ic_sync_job` (
`ID` varchar(64) NOT NULL COMMENT 'ID',
`CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户ID',
`ORG_ID` varchar(64) NOT NULL COMMENT '组织ID',
`PID` varchar(255) NOT NULL COMMENT '组织ID的上级',
`ORG_ID_PATH` varchar(1024) NOT NULL COMMENT '组织ID的所有上级,包括org_id',
`JOB_TYPE` varchar(255) NOT NULL COMMENT '任务类型,残疾:disability;死亡:death;核酸:nat;',
`OPERATOR_ID` varchar(255) NOT NULL COMMENT '操作员ID【staffId】',
`OPERATION_STATUS` varchar(255) DEFAULT NULL COMMENT '操作状态,等待中:waiting;进行中:processing;结束:finish',
`PROCESSOR_IP` varchar(15) DEFAULT NULL COMMENT '处理器实例ip',
`DEL_FLAG` int(11) NOT NULL,
`REVISION` int(11) NOT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建人',
`CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
`UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人',
`UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`ID`),
KEY `ORG_ID` (`ORG_ID`,`OPERATION_STATUS`,`JOB_TYPE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='同步任务表'

17
epmet-user/epmet-user-server/src/main/resources/mapper/IcSyncJobDao.xml

@ -3,8 +3,8 @@
<mapper namespace="com.epmet.dao.IcSyncJobDao"> <mapper namespace="com.epmet.dao.IcSyncJobDao">
<!--查询可执行任务列表--> <!--查询指定状态的任务列表-->
<select id="selectExecutableJobList" resultType="com.epmet.entity.IcSyncJobEntity"> <select id="selectJobListByStatus" resultType="com.epmet.entity.IcSyncJobEntity">
select id, select id,
customer_id, customer_id,
org_id, org_id,
@ -13,6 +13,7 @@
job_type, job_type,
operator_id, operator_id,
operation_status, operation_status,
processor_ip,
del_flag, del_flag,
revision, revision,
created_by, created_by,
@ -20,10 +21,16 @@
updated_by, updated_by,
updated_time updated_time
from ic_sync_job from ic_sync_job
where OPERATION_STATUS = 'waiting' where
DEL_FLAG = 0
and OPERATION_STATUS = #{status}
and JOB_TYPE = #{jobType} and JOB_TYPE = #{jobType}
and DEL_FLAG = 0 <if test="processorIp != null">
and PROCESSOR_IP = #{processorIp}
</if>
order by CREATED_TIME asc order by CREATED_TIME asc
limit #{itemCount} <if test="itemCount != null">
limit #{itemCount}
</if>
</select> </select>
</mapper> </mapper>
Loading…
Cancel
Save