fix(event-bridge): restore overseas event delivery

This commit is contained in:
2026-08-26 11:06:24 +08:00
parent 44fee01761
commit 15421db421
4 changed files with 149 additions and 2 deletions
@@ -14,7 +14,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.annotation.Resource;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Objects;
/**
@@ -78,7 +80,7 @@ public class EventInboxService {
&& Objects.equals(existing.getAggregateId(), envelope.aggregateId())
&& Objects.equals(existing.getAggregateVersion(), envelope.aggregateVersion())
&& Objects.equals(existing.getHandoverVersion(), envelope.handoverVersion())
&& Objects.equals(existing.getOccurredAt(), envelope.occurredAt())
&& Objects.equals(normalizeOccurredAt(existing.getOccurredAt()), normalizeOccurredAt(envelope.occurredAt()))
&& Objects.equals(existing.getTraceId(), envelope.traceId())
&& Objects.equals(existing.getCorrelationId(), envelope.correlationId())
&& Objects.equals(existing.getCausationId(), envelope.causationId());
@@ -100,7 +102,7 @@ public class EventInboxService {
inbox.setTraceId(envelope.traceId());
inbox.setCorrelationId(envelope.correlationId());
inbox.setCausationId(envelope.causationId());
inbox.setOccurredAt(envelope.occurredAt());
inbox.setOccurredAt(normalizeOccurredAt(envelope.occurredAt()));
inbox.setPayloadHash(envelope.payloadHash().toLowerCase(java.util.Locale.ROOT));
try {
inbox.setPayloadJson(objectMapper.writeValueAsString(envelope.payload()));
@@ -111,4 +113,8 @@ public class EventInboxService {
inbox.setReceivedAt(LocalDateTime.now());
return inbox;
}
private static Instant normalizeOccurredAt(Instant value) {
return value == null ? null : value.truncatedTo(ChronoUnit.MILLIS);
}
}
@@ -65,6 +65,22 @@ class EventInboxServiceTest {
assertThat(receiveCount("DUPLICATE")).isEqualTo(1.0);
}
@Test
void 数据库毫秒精度截断后相同事件仍判定为重复() {
EventEnvelope source = envelope("sha256:placeholder");
EventEnvelope precise = new EventEnvelope(source.eventId(), source.eventType(), source.eventVersion(),
Instant.parse("2026-07-29T08:30:00.123456789Z"), source.sourceRegion(), source.targetRegion(),
source.tenantId(), source.aggregateType(), source.aggregateId(), source.aggregateVersion(),
source.handoverVersion(), source.traceId(), source.correlationId(), source.causationId(),
source.payload(), source.payloadHash());
EventEnvelope envelope = withHash(precise);
BridgeInbox existing = existing(envelope, envelope.payloadHash());
existing.setOccurredAt(Instant.parse("2026-07-29T08:30:00.123Z"));
when(store.findByEventId(envelope.eventId())).thenReturn(existing);
assertThat(service.receive(envelope).result()).isEqualTo("重复");
}
@Test
void 相同事件但摘要不同时拒绝覆盖() {
EventEnvelope envelope = withHash(envelope("sha256:placeholder"));