list);
+}
diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java
index 59e5eaf1..33b87394 100644
--- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java
+++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/XzjcInfoSyncServiceImpl.java
@@ -1,22 +1,32 @@
package com.zdxt.enforcementcode.service.impl;
+import com.zdxt.enforcementcode.domain.bo.XzjcInfoSyncBo;
+import com.zdxt.enforcementcode.mapper.XzjcInfoSyncMapper;
import com.zdxt.enforcementcode.service.IXzjcInfoSyncService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.jdbc.core.JdbcTemplate;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
/**
* 行政检查信息同步服务
* 增量同步 enforcement_registration -> SZSFJ_ZFJDM_XZJC_INFO(市司法局数据共享表)
* 增量水位:目标表 MAX(YWXGSJ),源表 update_time >= 水位即为增量;目标表为空时首次自动全量
* 写入策略:基于 uk_ywid 唯一键 INSERT ... ON DUPLICATE KEY UPDATE(幂等)
+ * 读取策略:(update_time, id) 键集分页,单页单批,避免一次性加载全量数据导致内存溢出
+ * 并发控制:Redisson 分布式锁,覆盖 Quartz 调度重叠、手动触发及多实例部署场景
+ * SQL 定义见 mapper/enforcementcode/XzjcInfoSyncMapper.xml
*
* @author zdxt
*/
@@ -25,153 +35,144 @@ import java.util.Map;
@RequiredArgsConstructor
public class XzjcInfoSyncServiceImpl implements IXzjcInfoSyncService {
- /** 批量写入大小 */
- private static final int BATCH_SIZE = 500;
+ /** 分页读取大小(与批量写入大小一致,一页一批) */
+ private static final int PAGE_SIZE = 500;
- private final JdbcTemplate jdbcTemplate;
+ /** 单次任务最大分页数,防止异常场景下扫描失控(500*1000=单次最多约 50 万条,剩余下次任务继续) */
+ private static final int MAX_PAGES = 1000;
+
+ /** 同步分布式锁 key */
+ private static final String LOCK_KEY = "xzjc_info_sync:lock";
+
+ private final XzjcInfoSyncMapper xzjcInfoSyncMapper;
+
+ private final RedissonClient redissonClient;
/**
* 执行一次增量同步
+ * 通过 Redis 分布式锁保证同一时刻仅一个任务实例在执行(含多实例部署场景)
*
- * @return 处理条数
+ * @return 处理条数;未获取到锁(上一次仍在执行)或被中断时返回 0
*/
public int syncIncremental() {
- Timestamp watermark = queryWatermark();
- List