package com.yunhai.campusnotice.job; import com.yunhai.campusnotice.service.INoticeService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * 定时发送调度任务(改造方案 4.2)。 *
每分钟扫描 status=1 且 timingSendTime<=now 且 timing_published=0 的通知, * 逐条 CAS 抢占(timing_published 0→1)后执行真实发布(圈人/落学员快照/发短信/统计口径对齐)。 * 幂等由 CAS 保证:重复扫描同一通知只触发一次真实发布。
*注意:当前按单实例部署实现(无分布式锁);若后续多实例部署, * 需引入分布式锁(DB 行锁/Redis)或保留 CAS 抢占语义由数据库串行化。
*/ @Component public class TimingPublishJob { private static final Logger log = LoggerFactory.getLogger(TimingPublishJob.class); @Autowired private INoticeService noticeService; @Scheduled(fixedDelay = 60_000, initialDelay = 30_000) public void publishDue() { try { int count = noticeService.timingPublishDue(); if (count > 0) { log.info("[TimingPublishJob] 本轮定时发布 {} 条通知", count); } } catch (Exception e) { // 单条失败不影响下一轮扫描(事务内单条异常会整体回滚该条,由日志暴露) log.error("[TimingPublishJob] 定时发布调度异常", e); } } }