| | |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.util.*; |
| | | import java.util.concurrent.atomic.AtomicBoolean; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private RedisCache redisCache; |
| | | |
| | | /** |
| | | * 用户同步任务运行标记,避免重复点击/重复调用并发跑全量同步 |
| | | */ |
| | | private final AtomicBoolean userSyncRunning = new AtomicBoolean(false); |
| | | |
| | | private static final long SHARDING_THRESHOLD = 5_000_000L; |
| | | private static final String PAT_ARCHIVE_TABLE = "pat_archive"; |
| | |
| | | return size; |
| | | } |
| | | |
| | | /** |
| | | * 异步同步用户信息:接口立即返回,实际同步交给线程池后台执行。 |
| | | * 使用 AtomicBoolean 防止重复提交导致多个全量同步任务并发执行。 |
| | | */ |
| | | @Override |
| | | public boolean selectUserListAsync(SysUser sysUser) { |
| | | if (!userSyncRunning.compareAndSet(false, true)) { |
| | | log.warn("用户信息同步任务正在执行中,忽略本次提交"); |
| | | return false; |
| | | } |
| | | try { |
| | | taskExecutor.execute(() -> { |
| | | long start = System.currentTimeMillis(); |
| | | log.info("用户信息异步同步任务开始执行"); |
| | | try { |
| | | Integer count = selectUserList(sysUser); |
| | | log.info("用户信息异步同步任务执行完成,处理数量:{},耗时:{}ms", |
| | | count, System.currentTimeMillis() - start); |
| | | } catch (Throwable e) { |
| | | log.error("用户信息异步同步任务执行失败,耗时:{}ms", |
| | | System.currentTimeMillis() - start, e); |
| | | } finally { |
| | | userSyncRunning.set(false); |
| | | } |
| | | }); |
| | | return true; |
| | | } catch (RuntimeException e) { |
| | | userSyncRunning.set(false); |
| | | log.error("用户信息异步同步任务提交失败", e); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Integer selectUserList(SysUser sysUser) { |
| | | List<SysUser> sysUserList = chMapper.selectUserList(sysUser); |