package com.imutil.task; import com.imutil.entity.Tenant; import com.imutil.mapper.TenantMapper; import com.imutil.service.SyncService; import lombok.extern.slf4j.Slf4j; import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Inject; import org.noear.solon.scheduling.annotation.Scheduled; import java.util.List; /** * 数据同步补拉对账定时任务 *

* 定期重跑群消息 + 单聊同步(幂等,本地已有的跳过、缺失的补入), * 兜底腾讯侧有而本系统暂无的消息,确保本系统数据最全、业务系统不漏收。 * 对应 app.yml 的 solon.scheduling.job.syncCheckJob。 *

* 遍历所有租户,对每个用主应用密钥执行 checkAndPull(主应用数据为主)。 * * @author imutil */ @Slf4j @Component public class SyncCheckTask { @Inject private SyncService syncService; @Inject private TenantMapper tenantMapper; /** * 由 app.yml syncCheckJob 驱动(默认 fixedDelay=1 小时) */ @Scheduled(name = "syncCheckJob") public void run() { List tenants = tenantMapper.selectList(null); if (tenants == null || tenants.isEmpty()) { return; } int ok = 0; for (Tenant t : tenants) { String tid = t.getTenantId(); if (tid == null || tid.isEmpty()) { continue; } try { syncService.checkAndPull(tid); ok++; } catch (Throwable e) { // 单租户异常不影响其他租户 log.error("补拉对账定时任务异常 tenant={}", tid, e); } } log.info("补拉对账定时任务完成 租户数={} 成功={}", tenants.size(), ok); } }