29445c6825
- 新增接入 WAL、检查点、背压恢复及可靠分发机制,完善 Kafka 幂等发布、分区、重试、DLT 和补偿流程 - 引入规则预编译、批内快照及 JetCache/Caffeine 两级缓存,支持缓存失效广播、影子对账和执行指标 - 升级 InfluxDB V2 原始日志模型,统一接收时间与 Point 时间,支持按日 measurement、UUID 分桶及 V1/V2 双读 - 重构达梦标准化批量写入与统计链路,支持事务内直写、增量投影、幂等控制、窗口水位和日期切换 - 完善告警处理、配置校验、运行监控及测试覆盖
56 lines
2.6 KiB
Java
56 lines
2.6 KiB
Java
package com.common.service;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
import org.springframework.jdbc.core.JdbcTemplate;
|
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.lang.reflect.Method;
|
|
import java.time.LocalDateTime;
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.anyString;
|
|
import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.mockingDetails;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
class AnalysisCheckpointServiceTest {
|
|
|
|
@Test
|
|
void ruleLeaseUsesFractionalDayInsteadOfIntegerDivision() {
|
|
JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
|
|
when(jdbcTemplate.update(anyString(), any(Object[].class))).thenReturn(1);
|
|
AnalysisCheckpointService service = new AnalysisCheckpointService(jdbcTemplate);
|
|
ReflectionTestUtils.setField(service, "leaseSeconds", 600);
|
|
|
|
service.claimRuleWindow("rule-1", "1:window-v2",
|
|
LocalDateTime.of(2026, 8, 10, 17, 35),
|
|
LocalDateTime.of(2026, 8, 10, 17, 42));
|
|
|
|
assertTrue(mockingDetails(jdbcTemplate).getInvocations().stream()
|
|
.map(invocation -> String.valueOf(invocation.getRawArguments()[0]))
|
|
.anyMatch(sql -> sql.contains("lease_until=SYSDATE+(?/86400.0)")));
|
|
}
|
|
|
|
@Test
|
|
void terminalCheckpointUpdatesAreTransactional() throws Exception {
|
|
assertTransactional("completeRuleWindow", String.class, String.class,
|
|
LocalDateTime.class, LocalDateTime.class, long.class, long.class);
|
|
assertTransactional("failRuleWindow", String.class, String.class,
|
|
LocalDateTime.class, LocalDateTime.class, String.class, String.class);
|
|
assertTransactional("completeAlgorithmWindow", String.class, String.class,
|
|
LocalDateTime.class, LocalDateTime.class, long.class, long.class);
|
|
assertTransactional("failAlgorithmWindow", String.class, String.class,
|
|
LocalDateTime.class, LocalDateTime.class, String.class, String.class);
|
|
}
|
|
|
|
private void assertTransactional(String methodName, Class<?>... parameterTypes) throws Exception {
|
|
Method method = AnalysisCheckpointService.class.getMethod(methodName, parameterTypes);
|
|
Transactional annotation = method.getAnnotation(Transactional.class);
|
|
assertNotNull(annotation, methodName + " must commit when Hikari auto-commit is disabled");
|
|
assertTrue(annotation.rollbackFor().length == 0);
|
|
}
|
|
}
|