diff --git a/modules/core/session-core/src/main/java/com/lingniu/ingest/session/InMemorySessionStore.java b/modules/core/session-core/src/main/java/com/lingniu/ingest/session/InMemorySessionStore.java index 1b022b9d..ccdb80d1 100644 --- a/modules/core/session-core/src/main/java/com/lingniu/ingest/session/InMemorySessionStore.java +++ b/modules/core/session-core/src/main/java/com/lingniu/ingest/session/InMemorySessionStore.java @@ -10,10 +10,10 @@ import java.util.concurrent.ConcurrentMap; import java.util.function.UnaryOperator; /** - * 纯内存会话存储。支持按 sessionId / vin / phone 三种 key 查询。 + * 测试/本地用纯内存会话存储。支持按 sessionId / vin / phone 三种 key 查询。 * *
失活清理:基于 {@link Caffeine} 的 {@code expireAfterAccess 30 分钟}。 - * 生产环境若需多节点一致性,可用 Redis 实现替换此 Bean。 + * 生产自动配置拒绝 memory 模式,应使用 Redis 会话索引。 */ public final class InMemorySessionStore implements SessionStore { diff --git a/modules/core/session-core/src/main/java/com/lingniu/ingest/session/SessionStore.java b/modules/core/session-core/src/main/java/com/lingniu/ingest/session/SessionStore.java index 32c94941..38811206 100644 --- a/modules/core/session-core/src/main/java/com/lingniu/ingest/session/SessionStore.java +++ b/modules/core/session-core/src/main/java/com/lingniu/ingest/session/SessionStore.java @@ -4,7 +4,7 @@ import java.util.Optional; import java.util.function.UnaryOperator; /** - * 设备会话存储 SPI。默认实现是内存 + Caffeine,生产可替换为 Redis 兜底。 + * 设备会话存储 SPI。生产自动配置只创建 Redis 实现;测试可显式提供轻量实现。 */ public interface SessionStore { diff --git a/modules/core/vehicle-identity/src/main/java/com/lingniu/ingest/identity/StatelessVehicleIdentityResolver.java b/modules/core/vehicle-identity/src/main/java/com/lingniu/ingest/identity/StatelessVehicleIdentityResolver.java deleted file mode 100644 index ecaa45f2..00000000 --- a/modules/core/vehicle-identity/src/main/java/com/lingniu/ingest/identity/StatelessVehicleIdentityResolver.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.lingniu.ingest.identity; - -/** - * Stateless production fallback used when a caller has no injected identity service. - * - *
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);
- }
-}
diff --git a/modules/core/vehicle-identity/src/test/java/com/lingniu/ingest/identity/StatelessVehicleIdentityResolverTest.java b/modules/core/vehicle-identity/src/test/java/com/lingniu/ingest/identity/StatelessVehicleIdentityResolverTest.java
deleted file mode 100644
index 5314cf19..00000000
--- a/modules/core/vehicle-identity/src/test/java/com/lingniu/ingest/identity/StatelessVehicleIdentityResolverTest.java
+++ /dev/null
@@ -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);
- }
-}
diff --git a/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/handler/Jt1078MalformedRtpHandler.java b/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/handler/Jt1078MalformedRtpHandler.java
index 06fbf4b9..5939384f 100644
--- a/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/handler/Jt1078MalformedRtpHandler.java
+++ b/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/handler/Jt1078MalformedRtpHandler.java
@@ -5,7 +5,6 @@ import com.lingniu.ingest.api.annotation.EventEmit;
import com.lingniu.ingest.api.annotation.MessageMapping;
import com.lingniu.ingest.api.annotation.ProtocolHandler;
import com.lingniu.ingest.api.event.VehicleEvent;
-import com.lingniu.ingest.identity.StatelessVehicleIdentityResolver;
import com.lingniu.ingest.identity.VehicleIdentity;
import com.lingniu.ingest.identity.VehicleIdentityLookup;
import com.lingniu.ingest.identity.VehicleIdentityResolver;
@@ -17,6 +16,7 @@ import java.time.Instant;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.UUID;
@ProtocolHandler(protocol = ProtocolId.JT1078)
@@ -24,12 +24,8 @@ public final class Jt1078MalformedRtpHandler {
private final VehicleIdentityResolver identityResolver;
- public Jt1078MalformedRtpHandler() {
- this(new StatelessVehicleIdentityResolver());
- }
-
public Jt1078MalformedRtpHandler(VehicleIdentityResolver identityResolver) {
- this.identityResolver = identityResolver == null ? new StatelessVehicleIdentityResolver() : identityResolver;
+ this.identityResolver = Objects.requireNonNull(identityResolver, "identityResolver must not be null");
}
@MessageMapping(command = Jt1078MediaMessageId.MALFORMED_RTP, desc = "JT1078 RTP 入口坏包兜底")
diff --git a/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/media/Jt1078MalformedRtpEventPublisher.java b/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/media/Jt1078MalformedRtpEventPublisher.java
index 5961d364..5ebff586 100644
--- a/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/media/Jt1078MalformedRtpEventPublisher.java
+++ b/modules/protocols/protocol-jt1078/src/main/java/com/lingniu/ingest/protocol/jt1078/media/Jt1078MalformedRtpEventPublisher.java
@@ -2,7 +2,6 @@ package com.lingniu.ingest.protocol.jt1078.media;
import com.lingniu.ingest.api.ProtocolId;
import com.lingniu.ingest.api.pipeline.RawFrame;
-import com.lingniu.ingest.identity.StatelessVehicleIdentityResolver;
import com.lingniu.ingest.identity.VehicleIdentity;
import com.lingniu.ingest.identity.VehicleIdentityLookup;
import com.lingniu.ingest.identity.VehicleIdentityResolver;
@@ -11,6 +10,7 @@ import com.lingniu.ingest.identity.VehicleIdentitySource;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import java.util.function.Consumer;
public final class Jt1078MalformedRtpEventPublisher {
@@ -18,14 +18,10 @@ public final class Jt1078MalformedRtpEventPublisher {
private final VehicleIdentityResolver identityResolver;
private final Consumer