package com.baiyue.eventbridge.service; import com.baiyue.common.event.EventEnvelope; import com.baiyue.common.event.EventTypes; import com.baiyue.common.event.RegionCode; import com.baiyue.eventbridge.config.EventDispatcherProperties; import com.baiyue.eventbridge.domain.BridgeInbox; import com.baiyue.eventbridge.trace.EventBridgeHttpTracePropagation; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; @Component public class HttpFinanceEventClient implements FinanceEventClient { @Resource private ObjectMapper objectMapper; @Resource private EventDispatcherProperties properties; @Resource private EventBridgeHttpTracePropagation tracePropagation; @Value("${baiyue.event-dispatcher.finance-consumer-url:http://127.0.0.1:9203/internal/finance/v1/business-fee-source-events}") private URI consumerUrl; @Value("${baiyue.event-dispatcher.finance-wallet-consumer-url:http://127.0.0.1:9203/internal/finance/v1/wallet-command-events}") private URI walletConsumerUrl; @Value("${baiyue.security.internal-service-token:}") private String serviceToken; private HttpClient httpClient; @PostConstruct void initializeHttpClient() { httpClient = HttpClient.newBuilder().connectTimeout(properties.connectTimeout()).build(); } @Override public String deliver(BridgeInbox row) throws Exception { EventEnvelope envelope = new EventEnvelope(row.getEventId(), row.getEventType(), row.getEventVersion(), row.getOccurredAt(), RegionCode.valueOf(row.getSourceRegion()), RegionCode.valueOf(row.getTargetRegion()), row.getCustomerId(), row.getAggregateType(), row.getAggregateId(), row.getAggregateVersion(), row.getHandoverVersion(), row.getTraceId(), row.getCorrelationId(), row.getCausationId(), objectMapper.readTree(row.getPayloadJson()), row.getPayloadHash()); URI target = EventTypes.WALLET_COMMAND_REQUESTED.equals(row.getEventType()) ? walletConsumerUrl : consumerUrl; HttpRequest request = tracePropagation.apply(HttpRequest.newBuilder(target) .timeout(properties.requestTimeout()).header("Content-Type", "application/json") .header("X-Internal-Service-Token", serviceToken)) .POST(HttpRequest.BodyPublishers.ofString(objectMapper.writeValueAsString(envelope))).build(); HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); JsonNode body; try { body = objectMapper.readTree(response.body()); } catch (Exception ignored) { body = null; } if (response.statusCode() / 100 != 2 || body == null || !"200".equals(body.path("code").asText())) { throw new IllegalStateException("Finance消费失败: HTTP " + response.statusCode() + ", code=" + (body == null ? "missing" : body.path("code").asText("missing"))); } return String.valueOf(response.statusCode()); } }