diff --git a/firstleg/src/main/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQueryScheduler.java b/firstleg/src/main/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQueryScheduler.java index 22fee924f..940b24152 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQueryScheduler.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQueryScheduler.java @@ -21,6 +21,7 @@ import java.util.UUID; @Component @ConditionalOnProperty(prefix = "baiyue.carrier-schedule.scheduler", name = "enabled", havingValue = "true") public class CarrierScheduleQueryScheduler { + static final String PROVIDER_TEMPORARILY_UNAVAILABLE = "轨迹供应商暂时不可用,请稍后重试或人工补录节点"; private final CarrierScheduleQueryRepository repository; private final CarrierScheduleQueryService service; private final CarrierScheduleIntegrationClient integration; @@ -96,7 +97,7 @@ public class CarrierScheduleQueryScheduler { result.errorMessage()); } catch (RuntimeException exception) { service.completeScheduledAttempt(candidate.getId(), "RETRYABLE_FAILURE", "PROVIDER_CALL_FAILED", - exception.getClass().getSimpleName()); + PROVIDER_TEMPORARILY_UNAVAILABLE); } } } diff --git a/firstleg/src/test/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQuerySchedulerTest.java b/firstleg/src/test/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQuerySchedulerTest.java index cee52bf2b..38eb11a66 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQuerySchedulerTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/portschedule/service/CarrierScheduleQuerySchedulerTest.java @@ -158,6 +158,22 @@ class CarrierScheduleQuerySchedulerTest { verify(service).completeScheduledAttempt(1L, "RETRYABLE_FAILURE", "HTTP_503", "unavailable"); } + @Test + void providerClientFailurePersistsBusinessSafeMessageInsteadOfFrameworkExceptionName() { + CarrierScheduleQueryRepository repository = mock(CarrierScheduleQueryRepository.class); + CarrierScheduleQueryService service = mock(CarrierScheduleQueryService.class); + CarrierScheduleIntegrationClient integration = mock(CarrierScheduleIntegrationClient.class); + CarrierScheduleQueryScheduler scheduler = new CarrierScheduleQueryScheduler(repository, service, integration); + CarrierScheduleQueryEntity task = task(1L); + when(repository.claimLease(anyLong(), anyString(), any(), any())).thenReturn(true); + when(integration.query(any(), any())).thenThrow(new RuntimeException("NoFallbackAvailableException")); + + scheduler.execute(task, LocalDateTime.of(2026, 9, 9, 9, 0)); + + verify(service).completeScheduledAttempt(1L, "RETRYABLE_FAILURE", "PROVIDER_CALL_FAILED", + CarrierScheduleQueryScheduler.PROVIDER_TEMPORARILY_UNAVAILABLE); + } + private static CarrierScheduleQueryEntity task(long id) { CarrierScheduleQueryEntity value = new CarrierScheduleQueryEntity(); value.setId(id); return value; }