1
0
mirror of synced 2026-10-13 02:26:36 +08:00

test: 修复内存消息去重过期测试的偶发失败

This commit is contained in:
Binary Wang
2026-09-19 23:19:59 +08:00
parent 700c676952
commit db880bb0da

View File

@@ -9,9 +9,8 @@ import static org.testng.Assert.assertTrue;
@Test
public class WxMessageInMemoryDuplicateCheckerTest {
private WxMessageInMemoryDuplicateChecker checker = new WxMessageInMemoryDuplicateChecker(2000L, 1000L);
public void test() throws InterruptedException {
WxMessageInMemoryDuplicateChecker checker = new WxMessageInMemoryDuplicateChecker(2000L, 1000L);
Long[] msgIds = new Long[]{1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L};
// 第一次检查
@@ -20,18 +19,22 @@ public class WxMessageInMemoryDuplicateCheckerTest {
assertFalse(result);
}
// 过1秒再检查
TimeUnit.SECONDS.sleep(1);
// 未过期时应识别为重复消息
for (Long msgId : msgIds) {
boolean result = checker.isDuplicate(String.valueOf(msgId));
assertTrue(result);
}
// 过1.5秒再检查
TimeUnit.MILLISECONDS.sleep(1500L);
// 过期记录由后台线程定期清理,不能假定 TTL 到达后立即被删除。
long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(10);
for (Long msgId : msgIds) {
boolean result = checker.isDuplicate(String.valueOf(msgId));
assertFalse(result);
while (result && System.nanoTime() < deadline) {
TimeUnit.MILLISECONDS.sleep(20L);
result = checker.isDuplicate(String.valueOf(msgId));
}
assertFalse(result, "Expired message was not cleared: " + msgId);
assertTrue(checker.isDuplicate(String.valueOf(msgId)));
}
}