Files
CampusNotice/src/main/java/com/yunhai/campusnotice/job/TimingPublishJob.java
T
wanghu e20ba5f38b
build / build-push (push) Failing after 1m13s
通知
2026-09-10 15:40:38 +08:00

39 lines
1.6 KiB
Java

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)。
* <p>每分钟扫描 status=1 且 timingSendTime<=now 且 timing_published=0 的通知,
* 逐条 CAS 抢占(timing_published 0→1)后执行真实发布(圈人/落学员快照/发短信/统计口径对齐)。
* 幂等由 CAS 保证:重复扫描同一通知只触发一次真实发布。</p>
* <p>注意:当前按单实例部署实现(无分布式锁);若后续多实例部署,
* 需引入分布式锁(DB 行锁/Redis)或保留 CAS 抢占语义由数据库串行化。</p>
*/
@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);
}
}
}