|
|
@@ -71,6 +71,8 @@ public class Task {
|
|
|
private ILiveRedConfService liveRedConfService;
|
|
|
@Autowired
|
|
|
private ILiveCouponIssueService liveCouponIssueService;
|
|
|
+ @Autowired
|
|
|
+ private ILiveVideoService liveVideoService;
|
|
|
|
|
|
@Autowired
|
|
|
public FsJstAftersalePushService fsJstAftersalePushService;
|
|
|
@@ -163,6 +165,34 @@ public class Task {
|
|
|
redisCache.redisTemplate.expire(key+live.getLiveId(), 1, TimeUnit.DAYS);
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ // 将开启的直播间信息写入Redis缓存,用于打标签定时任务
|
|
|
+ try {
|
|
|
+ // 获取视频时长
|
|
|
+ Long videoDuration = 0L;
|
|
|
+ List<LiveVideo> videos = liveVideoService.listByLiveId(live.getLiveId(), 1);
|
|
|
+ if (CollUtil.isNotEmpty(videos)) {
|
|
|
+ videoDuration = videos.stream()
|
|
|
+ .filter(v -> v.getDuration() != null)
|
|
|
+ .mapToLong(LiveVideo::getDuration)
|
|
|
+ .sum();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果视频时长大于0,将直播间信息存入Redis
|
|
|
+ if (videoDuration > 0 && live.getStartTime() != null) {
|
|
|
+ Map<String, Object> tagMarkInfo = new HashMap<>();
|
|
|
+ tagMarkInfo.put("liveId", live.getLiveId());
|
|
|
+ tagMarkInfo.put("startTime", live.getStartTime().atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli());
|
|
|
+ tagMarkInfo.put("videoDuration", videoDuration);
|
|
|
+
|
|
|
+ String tagMarkKey = String.format(LiveKeysConstant.LIVE_TAG_MARK_CACHE, live.getLiveId());
|
|
|
+ redisCache.setCacheObject(tagMarkKey, JSON.toJSONString(tagMarkInfo), 24, TimeUnit.HOURS);
|
|
|
+ log.info("直播间开启,已加入打标签缓存: liveId={}, startTime={}, videoDuration={}",
|
|
|
+ live.getLiveId(), live.getStartTime(), videoDuration);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("写入直播间打标签缓存失败: liveId={}, error={}", live.getLiveId(), e.getMessage(), e);
|
|
|
+ }
|
|
|
}
|
|
|
// 重新更新所有在直播的缓存
|
|
|
liveService.asyncToCache();
|
|
|
@@ -183,6 +213,15 @@ public class Task {
|
|
|
});
|
|
|
}
|
|
|
webSocketServer.removeLikeCountCache(live.getLiveId());
|
|
|
+
|
|
|
+ // 删除打标签缓存
|
|
|
+ try {
|
|
|
+ String tagMarkKey = String.format(LiveKeysConstant.LIVE_TAG_MARK_CACHE, live.getLiveId());
|
|
|
+ redisCache.deleteObject(tagMarkKey);
|
|
|
+ log.info("直播间结束,已删除打标签缓存: liveId={}", live.getLiveId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除直播间打标签缓存失败: liveId={}, error={}", live.getLiveId(), e.getMessage(), e);
|
|
|
+ }
|
|
|
}
|
|
|
// 重新更新所有在直播的缓存
|
|
|
liveService.asyncToCache();
|
|
|
@@ -579,4 +618,77 @@ public class Task {
|
|
|
public void updateRedQuantityNum() {
|
|
|
liveRedConfService.updateRedQuantityNum();
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 定时扫描开启的直播间,检查是否到了打标签的时间
|
|
|
+ * 每10秒执行一次
|
|
|
+ */
|
|
|
+ @Scheduled(cron = "0/10 * * * * ?")
|
|
|
+ @DistributeLock(key = "scanLiveTagMark", scene = "task")
|
|
|
+ public void scanLiveTagMark() {
|
|
|
+ try {
|
|
|
+ // 获取所有打标签缓存的key
|
|
|
+ String pattern = String.format(LiveKeysConstant.LIVE_TAG_MARK_CACHE, "*");
|
|
|
+ Set<String> keys = redisCache.redisTemplate.keys(pattern);
|
|
|
+
|
|
|
+ if (keys == null || keys.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ long currentTimeMillis = System.currentTimeMillis();
|
|
|
+ List<Long> processedLiveIds = new ArrayList<>();
|
|
|
+
|
|
|
+ for (String key : keys) {
|
|
|
+ try {
|
|
|
+ // 从Redis获取直播间信息
|
|
|
+ Object cacheValue = redisCache.getCacheObject(key);
|
|
|
+ if (cacheValue == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ String jsonStr = cacheValue.toString();
|
|
|
+ JSONObject tagMarkInfo = JSON.parseObject(jsonStr);
|
|
|
+ Long liveId = tagMarkInfo.getLong("liveId");
|
|
|
+ Long startTimeMillis = tagMarkInfo.getLong("startTime");
|
|
|
+ Long videoDuration = tagMarkInfo.getLong("videoDuration");
|
|
|
+
|
|
|
+ if (liveId == null || startTimeMillis == null || videoDuration == null || videoDuration <= 0) {
|
|
|
+ log.warn("直播间打标签缓存信息不完整: key={}, liveId={}, startTime={}, videoDuration={}",
|
|
|
+ key, liveId, startTimeMillis, videoDuration);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算结束时间:开始时间 + 视频时长(秒转毫秒)
|
|
|
+ long endTimeMillis = startTimeMillis + (videoDuration * 1000);
|
|
|
+
|
|
|
+ // 如果当前时间已经超过了结束时间,执行打标签操作
|
|
|
+ if (currentTimeMillis >= endTimeMillis) {
|
|
|
+ log.info("直播间视频播放完成,开始打标签: liveId={}, startTime={}, videoDuration={}, endTime={}, currentTime={}",
|
|
|
+ liveId, startTimeMillis, videoDuration, endTimeMillis, currentTimeMillis);
|
|
|
+
|
|
|
+ // 调用打标签方法
|
|
|
+ liveWatchUserService.qwTagMarkByLiveWatchLog(liveId);
|
|
|
+
|
|
|
+ // 标记为已处理,稍后删除缓存
|
|
|
+ processedLiveIds.add(liveId);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理直播间打标签缓存异常: key={}, error={}", key, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除已处理的直播间缓存
|
|
|
+ for (Long liveId : processedLiveIds) {
|
|
|
+ try {
|
|
|
+ String tagMarkKey = String.format(LiveKeysConstant.LIVE_TAG_MARK_CACHE, liveId);
|
|
|
+ redisCache.deleteObject(tagMarkKey);
|
|
|
+ log.info("已删除已处理的直播间打标签缓存: liveId={}", liveId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("删除直播间打标签缓存失败: liveId={}, error={}", liveId, e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("扫描直播间打标签任务异常: error={}", e.getMessage(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|