39 lines
1.6 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|