package com.zy.core.thread.support; import com.zy.common.utils.RedisUtil; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; public class RecentStationArrivalTracker { static final long DEFAULT_RETAIN_MS = 10_000L; static final String KEY_PREFIX = "station_recent_arrival_"; private final RedisUtil redisUtil; private final long retainSeconds; private final Map lastLoadedTaskByStation = new ConcurrentHashMap<>(); public RecentStationArrivalTracker(RedisUtil redisUtil) { this(redisUtil, DEFAULT_RETAIN_MS); } public RecentStationArrivalTracker(RedisUtil redisUtil, long retainMs) { this.redisUtil = redisUtil; long effectiveRetainMs = retainMs <= 0L ? DEFAULT_RETAIN_MS : retainMs; this.retainSeconds = Math.max(1L, (long) Math.ceil(effectiveRetainMs / 1000d)); } public void observe(Integer stationId, Integer taskNo, boolean loading) { if (stationId == null || stationId <= 0) { return; } if (!loading || taskNo == null || taskNo <= 0) { lastLoadedTaskByStation.remove(stationId); return; } Integer previousTaskNo = lastLoadedTaskByStation.put(stationId, taskNo); if (Objects.equals(previousTaskNo, taskNo) || redisUtil == null) { return; } redisUtil.set(buildKey(stationId, taskNo), "1", retainSeconds); } public boolean hasRecentArrival(Integer stationId, Integer taskNo) { if (redisUtil == null) { return false; } String key = buildKey(stationId, taskNo); return key != null && redisUtil.get(key) != null; } private String buildKey(Integer stationId, Integer taskNo) { if (stationId == null || stationId <= 0 || taskNo == null || taskNo <= 0) { return null; } return KEY_PREFIX + stationId + "_" + taskNo; } }