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);
    }
相关推荐
默辨6 天前
再谈SpringCloud Gateway源码
java·网关·spring cloud·gateway·reactor·webflux
Golinie15 天前
【Linux网络编程】谈谈网络编程中的select、poll、epoll、Reactor、Proactor模型(下)
linux·网络·reactor·epoll·io多路复用
@Java小牛马20 天前
Redis真的是单线程的吗?
数据库·redis·缓存·reactor·单线程·多线程
组合缺一24 天前
Solon Cloud Gateway 开发:导引
java·gateway·reactor·solon·响应式
组合缺一1 个月前
Solon Cloud Gateway 开发:Route 的过滤器与定制
java·后端·gateway·reactor·solon
组合缺一1 个月前
Solon Cloud Gateway 开发:Route 的匹配检测器及定制
java·gateway·reactor·solon
组合缺一1 个月前
Solon Cloud Gateway 开发:熟悉 Completable 响应式接口
java·gateway·reactor·solon
组合缺一1 个月前
Solon Cloud Gateway 开发:Route 的配置与注册方式
java·gateway·reactor·solon
silver98861 个月前
reactor框架使用时,数据流请求流程
java·reactor
silver98862 个月前
reactor中的并发
java·reactor