fix(firstleg): expose event bridge relay failures

This commit is contained in:
2026-08-25 13:02:26 +08:00
parent 4cca194eee
commit d686b05966
4 changed files with 103 additions and 6 deletions
@@ -1,5 +1,6 @@
package com.baiyue.firstleg.service;
import com.baiyue.common.core.api.ApiResponse;
import com.baiyue.common.event.EventEnvelope;
import com.baiyue.common.event.EventEnvelopeValidator;
import com.baiyue.firstleg.client.EventBridgeClient;
@@ -38,8 +39,7 @@ public class LoadingCompletedOutboxRelay {
EventEnvelope event=objectMapper.readValue(row.getPayloadJson(),EventEnvelope.class);
EventEnvelopeValidator.requireValid(event);
var response=client.receive(internalToken,event);
if(response==null || !response.successful() || response.data()==null
|| !event.eventId().equals(response.data().eventId())) throw new IllegalStateException("事件桥未确认头程跨区事件");
requireAcknowledgement(event, response);
repository.published(row.getId(),workerId,LocalDateTime.now());
} catch(Exception exception) {
String error=safeError(exception);
@@ -50,11 +50,37 @@ public class LoadingCompletedOutboxRelay {
}
}
private void requireAcknowledgement(EventEnvelope event,
ApiResponse<EventBridgeClient.Acknowledgement> response) {
if(response==null) throw new IllegalStateException("事件桥未返回响应");
if(!response.successful()) {
throw new IllegalStateException("事件桥拒绝头程跨区事件: code=" + response.code()
+ ", message=" + response.message() + ", requestId=" + response.requestId()
+ ", traceId=" + response.traceId());
}
if(response.data()==null || !event.eventId().equals(response.data().eventId())) {
throw new IllegalStateException("事件桥 ACK 不匹配: expectedEventId=" + event.eventId()
+ ", actualEventId=" + (response.data()==null?null:response.data().eventId()));
}
}
private String safeError(Exception exception) {
String value=exception.getMessage();
if(value==null || value.isBlank()) value=exception.getClass().getSimpleName();
Throwable diagnostic=diagnosticCause(exception);
String message=diagnostic.getMessage();
String value=diagnostic.getClass().getSimpleName()
+ ((message==null || message.isBlank())?"":": " + message);
if(internalToken!=null && !internalToken.isBlank()) value=value.replace(internalToken,"***");
value=value.replaceAll("[\\r\\n\\t]+"," ");
return value.length()>500?value.substring(0,500):value;
}
private Throwable diagnosticCause(Throwable failure) {
Throwable current=failure;
while(current.getCause()!=null && current.getCause()!=current
&& ("NoFallbackAvailableException".equals(current.getClass().getSimpleName())
|| "No fallback available.".equals(current.getMessage()))) {
current=current.getCause();
}
return current;
}
}