reactor的Hooks.enableAutomaticContextPropagation();不生效解决方案

  1. pom中需要先增加如下的内容
复制代码
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>context-propagation</artifactId>
    <version>1.1.2</version>
</dependency>
  1. 注意,要看idea是否将context-propagation引入了。我的idea就是不知道为什么,虽然pom中添加了这个maven,mvn clean install 也通过了,但是在idea中的三方库就是没有。我进行了手动引入

  2. 编写类继承ThreadLocalAccessor<String>。这个编写类的内容在官方文档中没有,坑人。因此按照官方文档,是不可能得到预期结果的

java 复制代码
import io.micrometer.context.ThreadLocalAccessor;
import io.micrometer.context.ContextRegistry;

public class CustomThreadLocalAccessor implements ThreadLocalAccessor<String> {

    public static final ThreadLocal<String> TL = new ThreadLocal<>();

    @Override
    public Object key() {
        return "TLKEY";
    }

    @Override
    public String getValue() {
        return TL.get();
    }

    @Override
    public void setValue(String value) {
        TL.set(value);
    }

    @Override
    public void reset() {
        TL.remove();
    }
}
  1. 使用
java 复制代码
   public static void main(String[] args) throws ClassNotFoundException {
        // 注册 ThreadLocalAccessor
        ContextRegistry.getInstance().registerThreadLocalAccessor(new CustomThreadLocalAccessor());

        // 启用自动 Context 传播
        Hooks.enableAutomaticContextPropagation();

        // 假设 TL 是注册的 ThreadLocal
        CustomThreadLocalAccessor.TL.set("HELLO");
        String TLKEY = "TLKEY";

        String x =
                Mono.just(1)
             .flatMap(v -> Mono.deferContextual(ctx->
                             Mono.just(Thread.currentThread().getName()+"-"+"delayed ctx[" + TLKEY + "]=" + ctx.getOrDefault(TLKEY, "not found") + ", " +
                             "TL=" + CustomThreadLocalAccessor.TL.get())))
                .contextWrite(ctx -> ctx.put(TLKEY, "HELLO"))
                        .flatMap(v -> Mono.deferContextual(ctx->
                                Mono.just(Thread.currentThread().getName()+"-"+"delayed ctx[" + TLKEY + "]=" + ctx.getOrDefault(TLKEY, "not found") + ", " +
                                        "TL=" + CustomThreadLocalAccessor.TL.get())))
                        .contextWrite(ctx -> Context.empty())
                .subscribeOn(Schedulers.boundedElastic())
                .block();
        System.out.println(x);
    }
相关推荐
zs宝来了6 天前
Netty Reactor 模型:Boss、Worker 与 EventLoop
reactor·netty·源码解析·线程模型·eventloop
李庆政3709 天前
Reactor-core 响应式编程 spring-boot-starter-webflux
java·spring boot·reactor·响应式编程·reactor-core
Trouvaille ~16 天前
【项目篇】从零手写高并发服务器(十):性能测试与项目总结
linux·运维·c++·reactor·性能测试·高并发服务器·webbench
Trouvaille ~17 天前
【项目篇】从零手写高并发服务器(七):定时器TimerWheel与线程池
运维·服务器·网络·c++·reactor·高并发·muduo库
cccyi720 天前
支持 HTTP 协议的主从 Reactor 高性能服务器组件
服务器·http·reactor
cccyi724 天前
仿 muduo 库 one thread one loop 式并发服务器实现
reactor
Trouvaille ~24 天前
【项目篇】从零手写高并发服务器(五):Channel事件管理与Poller模块
运维·服务器·c++·reactor·高并发·多路转接·epoll
Thomas.Sir1 个月前
深入剖析 Reactor 多线程模型
性能优化·reactor·多线程·proactor
tod1132 个月前
Reactor反应堆模式
网络·网络协议·tcp/ip·reactor·多路转接·tcpdump
带刺的坐椅2 个月前
赋予 AI Agent “无限续航”:语义保护型上下文压缩技术解析
ai·llm·reactor·agent·solon·solon-ai