You've already forked FrameTour-BE
- 在发送下载通知前检查用户是否已接收通知 - 在发送过期通知前检查用户是否已接收通知- 在发送额外下载通知前检查用户是否已接收通知 - 使用ConcurrentHashMap.newKeySet()确保线程安全- 添加调试日志以追踪重复通知的跳过情况- 优化通知逻辑以提升定时任务执行效率
This commit is contained in:
@@ -29,8 +29,11 @@ import java.util.Arrays;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@EnableScheduling
|
@EnableScheduling
|
||||||
@@ -51,11 +54,20 @@ public class DownloadNotificationTasker {
|
|||||||
@Scheduled(cron = "0 0 21 * * *")
|
@Scheduled(cron = "0 0 21 * * *")
|
||||||
public void sendDownloadNotification() {
|
public void sendDownloadNotification() {
|
||||||
log.info("开始执行定时任务");
|
log.info("开始执行定时任务");
|
||||||
|
// 用于记录已发送通知的用户ID,避免重复发送
|
||||||
|
Set<Long> sentMemberIds = ConcurrentHashMap.newKeySet();
|
||||||
videoMapper.listRelationByCreateTime(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000), new Date())
|
videoMapper.listRelationByCreateTime(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000), new Date())
|
||||||
.forEach(item -> {
|
.forEach(item -> {
|
||||||
if (item.getIsBuy() == 1) {
|
if (item.getIsBuy() == 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 检查该用户是否已经发送过通知,避免重复发送
|
||||||
|
if (sentMemberIds.contains(item.getMemberId())) {
|
||||||
|
log.debug("用户[memberId={}]已发送过下载通知,跳过", item.getMemberId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sentMemberIds.add(item.getMemberId());
|
||||||
|
|
||||||
MemberRespVO member = memberMapper.getById(item.getMemberId());
|
MemberRespVO member = memberMapper.getById(item.getMemberId());
|
||||||
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
|
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
|
||||||
// 发送模板消息
|
// 发送模板消息
|
||||||
@@ -110,11 +122,20 @@ public class DownloadNotificationTasker {
|
|||||||
@Scheduled(cron = "0 0 20 * * *")
|
@Scheduled(cron = "0 0 20 * * *")
|
||||||
public void sendExpireNotification() {
|
public void sendExpireNotification() {
|
||||||
log.info("开始执行定时任务");
|
log.info("开始执行定时任务");
|
||||||
|
// 用于记录已发送通知的用户ID,避免重复发送
|
||||||
|
Set<Long> sentMemberIds = ConcurrentHashMap.newKeySet();
|
||||||
videoMapper.listRelationByCreateTime(new Date(System.currentTimeMillis() - 2 * 24 * 60 * 60 * 1000), new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000))
|
videoMapper.listRelationByCreateTime(new Date(System.currentTimeMillis() - 2 * 24 * 60 * 60 * 1000), new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000))
|
||||||
.forEach(item -> {
|
.forEach(item -> {
|
||||||
if (item.getIsBuy() == 1) {
|
if (item.getIsBuy() == 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 检查该用户是否已经发送过通知,避免重复发送
|
||||||
|
if (sentMemberIds.contains(item.getMemberId())) {
|
||||||
|
log.debug("用户[memberId={}]已发送过过期提醒通知,跳过", item.getMemberId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sentMemberIds.add(item.getMemberId());
|
||||||
|
|
||||||
MemberRespVO member = memberMapper.getById(item.getMemberId());
|
MemberRespVO member = memberMapper.getById(item.getMemberId());
|
||||||
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
|
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
|
||||||
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(item.getScenicId());
|
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(item.getScenicId());
|
||||||
@@ -202,12 +223,20 @@ public class DownloadNotificationTasker {
|
|||||||
}
|
}
|
||||||
log.info("当前景区{},配置了{}", scenic.getName(), scenicConfig.getString("extra_notification_time"));
|
log.info("当前景区{},配置了{}", scenic.getName(), scenicConfig.getString("extra_notification_time"));
|
||||||
|
|
||||||
|
// 使用线程安全的Set记录已发送通知的用户ID,避免重复发送
|
||||||
|
Set<Long> sentMemberIds = ConcurrentHashMap.newKeySet();
|
||||||
videoMapper.listRelationByCreateTime(DateUtil.beginOfDay(new Date()), new Date())
|
videoMapper.listRelationByCreateTime(DateUtil.beginOfDay(new Date()), new Date())
|
||||||
.stream()
|
.stream()
|
||||||
.filter(item -> item.getIsBuy() == 0)
|
.filter(item -> item.getIsBuy() == 0)
|
||||||
.filter(item -> item.getScenicId().equals(scenicId))
|
.filter(item -> item.getScenicId().equals(scenicId))
|
||||||
.parallel()
|
.parallel()
|
||||||
.forEach(item -> {
|
.forEach(item -> {
|
||||||
|
// 检查该用户是否已经发送过通知,避免重复发送
|
||||||
|
if (!sentMemberIds.add(item.getMemberId())) {
|
||||||
|
log.debug("用户[memberId={}]已发送过额外下载通知,跳过", item.getMemberId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
MemberRespVO member = memberMapper.getById(item.getMemberId());
|
MemberRespVO member = memberMapper.getById(item.getMemberId());
|
||||||
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
|
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
|
||||||
// 发送模板消息
|
// 发送模板消息
|
||||||
|
Reference in New Issue
Block a user