refactor: require identity resolver for jt1078 malformed rtp
This commit is contained in:
@@ -10,10 +10,10 @@ import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.function.UnaryOperator;
|
||||
|
||||
/**
|
||||
* 纯内存会话存储。支持按 sessionId / vin / phone 三种 key 查询。
|
||||
* 测试/本地用纯内存会话存储。支持按 sessionId / vin / phone 三种 key 查询。
|
||||
*
|
||||
* <p>失活清理:基于 {@link Caffeine} 的 {@code expireAfterAccess 30 分钟}。
|
||||
* 生产环境若需多节点一致性,可用 Redis 实现替换此 Bean。
|
||||
* 生产自动配置拒绝 memory 模式,应使用 Redis 会话索引。
|
||||
*/
|
||||
public final class InMemorySessionStore implements SessionStore {
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import java.util.Optional;
|
||||
import java.util.function.UnaryOperator;
|
||||
|
||||
/**
|
||||
* 设备会话存储 SPI。默认实现是内存 + Caffeine,生产可替换为 Redis 兜底。
|
||||
* 设备会话存储 SPI。生产自动配置只创建 Redis 实现;测试可显式提供轻量实现。
|
||||
*/
|
||||
public interface SessionStore {
|
||||
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
package com.lingniu.ingest.identity;
|
||||
|
||||
/**
|
||||
* Stateless production fallback used when a caller has no injected identity service.
|
||||
*
|
||||
* <p>Persistent binding belongs to {@link MySqlVehicleIdentityService}; this resolver only keeps
|
||||
* ingestion flowing with explicit VIN or stable external identifiers.
|
||||
*/
|
||||
public final class StatelessVehicleIdentityResolver implements VehicleIdentityResolver {
|
||||
|
||||
@Override
|
||||
public VehicleIdentity resolve(VehicleIdentityLookup lookup) {
|
||||
if (lookup == null) {
|
||||
return unknown();
|
||||
}
|
||||
if (!lookup.vin().isBlank()) {
|
||||
return new VehicleIdentity(lookup.vin(), true, VehicleIdentitySource.EXPLICIT_VIN);
|
||||
}
|
||||
if (!lookup.deviceId().isBlank()) {
|
||||
return new VehicleIdentity(lookup.deviceId(), false, VehicleIdentitySource.FALLBACK_DEVICE_ID);
|
||||
}
|
||||
if (!lookup.phone().isBlank()) {
|
||||
return new VehicleIdentity(lookup.phone(), false, VehicleIdentitySource.FALLBACK_PHONE);
|
||||
}
|
||||
if (!lookup.plate().isBlank()) {
|
||||
return new VehicleIdentity(lookup.plate(), false, VehicleIdentitySource.FALLBACK_PLATE);
|
||||
}
|
||||
return unknown();
|
||||
}
|
||||
|
||||
private static VehicleIdentity unknown() {
|
||||
return new VehicleIdentity("unknown", false, VehicleIdentitySource.UNKNOWN);
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
package com.lingniu.ingest.identity;
|
||||
|
||||
import com.lingniu.ingest.api.ProtocolId;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class StatelessVehicleIdentityResolverTest {
|
||||
|
||||
private final StatelessVehicleIdentityResolver resolver = new StatelessVehicleIdentityResolver();
|
||||
|
||||
@Test
|
||||
void explicitVinWinsWithoutPersistingAnyBinding() {
|
||||
VehicleIdentity identity = resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.MQTT_YUTONG, "LNVIN000000000001", "13900000000", "DEV001", "粤B12345"));
|
||||
|
||||
assertThat(identity.vin()).isEqualTo("LNVIN000000000001");
|
||||
assertThat(identity.resolved()).isTrue();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.EXPLICIT_VIN);
|
||||
}
|
||||
|
||||
@Test
|
||||
void fallsBackToStableExternalIdentifiersWithoutMarkingResolved() {
|
||||
assertThat(resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.JT808, "", "13900000001", "DEV001", "粤B12345")))
|
||||
.satisfies(identity -> {
|
||||
assertThat(identity.vin()).isEqualTo("DEV001");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.FALLBACK_DEVICE_ID);
|
||||
});
|
||||
|
||||
assertThat(resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.JT808, "", "13900000001", "", "粤B12345")))
|
||||
.satisfies(identity -> {
|
||||
assertThat(identity.vin()).isEqualTo("13900000001");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.FALLBACK_PHONE);
|
||||
});
|
||||
|
||||
assertThat(resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.JT808, "", "", "", "粤B12345")))
|
||||
.satisfies(identity -> {
|
||||
assertThat(identity.vin()).isEqualTo("粤B12345");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.FALLBACK_PLATE);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void returnsUnknownWhenNoIdentitySignalExists() {
|
||||
VehicleIdentity identity = resolver.resolve(new VehicleIdentityLookup(ProtocolId.JT808, "", "", "", ""));
|
||||
|
||||
assertThat(identity.vin()).isEqualTo("unknown");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.UNKNOWN);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user