diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/businessdatasyn/controller/BizSyncManageController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/businessdatasyn/controller/BizSyncManageController.java index cde6c3a9..51ffc461 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/businessdatasyn/controller/BizSyncManageController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/businessdatasyn/controller/BizSyncManageController.java @@ -9,6 +9,7 @@ import com.zdxt.enforcementcode.businessdatasyn.domain.mapper.BizSyncLogMapper; import com.zdxt.enforcementcode.businessdatasyn.domain.mapper.BizSyncRecordMapper; import com.zdxt.enforcementcode.businessdatasyn.domain.mapper.BizSyncTaskMapper; import com.zdxt.enforcementcode.businessdatasyn.executor.BusinessDataSyncScheduler; +import com.zdxt.enforcementcode.businessdatasyn.executor.SyncJobStatusHolder; import com.zdxt.enforcementcode.businessdatasyn.service.SyncRecordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -16,6 +17,10 @@ import org.dromara.common.core.domain.R; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + /** * 业务数据同步 - 管理接口 *
权限标识:efcode:bizsync:manage
@@ -34,35 +39,79 @@ public class BizSyncManageController { private final BizSyncTaskMapper taskMapper; private final BizSyncRecordMapper recordMapper; private final BizSyncLogMapper logMapper; + private final SyncJobStatusHolder jobStatusHolder; + + /** 专用线程池:串行执行同步任务,避免多个 force 并发压垮数据库 */ + private static final ExecutorService SYNC_EXECUTOR = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "biz-sync-async"); + t.setDaemon(true); + return t; + }); /** - * 手工触发指定表同步 + * 手工触发指定表同步(异步,立即返回 jobId) */ @PostMapping("/trigger/{configKey}") public R基于内存 ConcurrentHashMap,用于前端轮询判断异步任务是否完成
+ *注意:仅供 UI 触发的同步任务使用;Quartz Job 和单元测试直接调 scheduler,不经过本类
+ *单节点部署有效,多节点部署需改为 Redis
+ * + * @author zrb + */ +@Slf4j +@Component +public class SyncJobStatusHolder { + + /** 任务过期时间(毫秒),完成后 30 分钟自动清理 */ + private static final long EXPIRE_MS = 30 * 60 * 1000L; + + private final Map