开发者社区> 问答> 正文

Seata与spring cloud集成是采用Feign服务调用时 无法获取xid问题

Seata与springcloud集成时,客户端调用微服务接口时,由于hystrix 做了线程隔离 , Hystrix会将请求放入Hystrix的线程池中去执行,此时会新启一个子线程处理请求。 而RootContext采用threadlocal传递数据,无法在子线程中传递,造成在子线程中通过RootContext.getXid()获取为空。

展开
收起
一人吃饱,全家不饿 2021-02-01 23:29:30 1649 0
来自:阿里开源
1 条回答
写回答
取消 提交回答
  • 解决办法,在ThreadLocalContextCore类中,用InheritableThreadLocal 替代ThreadLocal。如下:

    public class ThreadLocalContextCore implements ContextCore {
    
    //private ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<Map<String, String>>()
    private ThreadLocal<Map<String, String>> threadLocal = new InheritableThreadLocal<Map<String, String>>() {
        @Override
        protected Map<String, String> initialValue() {
            return new HashMap<String, String>();
        }
    
    };
    

    因为在许多异步情况下,都不需要异步事务加入分布式事务,这会使分布式事务变大。我认为Seata可以提供某种机制来支持跨线程,并让消费者选择是否使用它。

    2021-02-01 23:29:37
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
+ 订阅
阿里巴巴相信开源的世界里人人贡献代码,人人获得收益,共同创造一个互帮互利的社区,促进技术进步和发展。
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载