fix(lastleg): retry shipping nodes until loading handover exists

This commit is contained in:
2026-09-30 00:23:06 +08:00
parent 221227204d
commit f87caf9dd1
2 changed files with 22 additions and 2 deletions
@@ -53,8 +53,6 @@ public class ContainerShippingNodeConsumer {
return DeliveryAck.of(envelope, DeliveryAck.Outcome.DUPLICATE);
}
gates.initialize(payload.containerBookingId(), payload.oceanBookingId(),
payload.containerNo(), 0, 1);
ContainerShippingGate gate = gates.lock(payload.containerBookingId());
if (gate == null) throw new EventDependencyNotReadyException("船节点柜级投影尚未就绪");
if (!payload.containerNo().equals(gate.getContainerNo())) {
@@ -1,6 +1,7 @@
package com.baiyue.lastleg.shipping.service;
import com.baiyue.common.event.EventEnvelope;
import com.baiyue.common.event.EventDependencyNotReadyException;
import com.baiyue.common.event.EventPayloadCanonicalizer;
import com.baiyue.common.event.EventPayloadHash;
import com.baiyue.common.event.EventTypes;
@@ -23,6 +24,8 @@ import java.time.Instant;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -42,6 +45,25 @@ class ContainerShippingNodeConsumerTest {
ReflectionTestUtils.setField(consumer, "objectMapper", json);
}
@Test
void shippingNodeBeforeLoadingHandoverRemainsRetryable() {
EventEnvelope event = event("123e4567-e89b-12d3-a456-426614174106", "PICKUP_READY", 80, 5,
Instant.parse("2026-08-21T10:00:00Z"));
assertThatThrownBy(() -> consumer.consume(event))
.isInstanceOf(EventDependencyNotReadyException.class);
verify(gates, never()).initialize(anyString(), anyString(), anyString(), anyLong(), anyLong());
verify(gates, never()).updateById(any(ContainerShippingGate.class));
verify(inboxes, never()).updateById(any(LastlegEventInbox.class));
ContainerShippingGate gate = gate("AWAITING_PICKUP_READY", 0, 0,
Instant.parse("2026-08-20T10:00:00Z"));
when(gates.lock("CB-1")).thenReturn(gate);
assertThat(consumer.consume(event).outcome())
.isEqualTo(com.baiyue.common.event.DeliveryAck.Outcome.APPLIED);
assertThat(gate.getStatus()).isEqualTo("RECEIVING_AVAILABLE");
}
@Test
void pickupReadyMonotonicallyOpensReceivingGate() {
ContainerShippingGate gate = gate("AWAITING_PICKUP_READY", 70, 4, Instant.parse("2026-08-20T10:00:00Z"));