diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java index 932fb448..9e486120 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignClient.java @@ -54,13 +54,7 @@ public class SeataFeignClient implements Client { public Response execute(Request request, Request.Options options) throws IOException { Request modifiedRequest = getModifyRequest(request); - - try { - return this.delegate.execute(modifiedRequest, options); - } - finally { - - } + return this.delegate.execute(modifiedRequest, options); } private Request getModifyRequest(Request request) { diff --git a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java index 2c67adf1..d68b2b5d 100644 --- a/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java +++ b/spring-cloud-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java @@ -17,21 +17,30 @@ package com.alibaba.cloud.seata.feign; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.springframework.beans.factory.BeanFactory; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; +import org.springframework.util.StringUtils; import feign.Client; import feign.Request; import feign.Response; +import io.seata.core.context.RootContext; /** * @author xiaojing */ public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient { + private static final int MAP_SIZE = 16; + private final BeanFactory beanFactory; SeataLoadBalancerFeignClient(Client delegate, @@ -43,11 +52,30 @@ public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient { @Override public Response execute(Request request, Request.Options options) throws IOException { - return super.execute(request, options); + Request modifiedRequest = getModifyRequest(request); + return super.execute(modifiedRequest, options); } private static Client wrap(Client delegate, BeanFactory beanFactory) { return (Client) new SeataFeignObjectWrapper(beanFactory).wrap(delegate); } + private Request getModifyRequest(Request request) { + + String xid = RootContext.getXID(); + + if (StringUtils.isEmpty(xid)) { + return request; + } + + Map> headers = new HashMap<>(MAP_SIZE); + headers.putAll(request.headers()); + + List fescarXid = new ArrayList<>(); + fescarXid.add(xid); + headers.put(RootContext.KEY_XID, fescarXid); + + return Request.create(request.method(), request.url(), headers, request.body(), + request.charset()); + } }