62 lines
3.3 KiB
Java
62 lines
3.3 KiB
Java
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<String> 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());
|
|
}
|
|
}
|