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);
    }
相关推荐
silver98862 天前
reactor中的并发
java·reactor
带刺的坐椅11 天前
RxSqlUtils(base R2dbc)
java·reactor·solon·r2dbc
CoderJia程序员甲2 个月前
重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer
java·spring boot·reactor·1024程序员节
Moon也爱算法呀2 个月前
关于个人开源网络库MoonNet
linux·c++·开源·github·reactor·网络库
诡异森林。3 个月前
Linux--epoll(ET)实现Reactor模式
linux·运维·github·reactor·reactor反应堆
wang09073 个月前
什么是reactor以及其三种版本
reactor·reactor工作模式·reactor三种版本
玩AI的小胡子4 个月前
AI人像换脸!Reactor插件本地部署方法(含报错解决及整合包)
ai作画·stable diffusion·aigc·reactor·ai写真
重庆大傑6 个月前
Reactor模型:网络线程模型演进
java·服务器·网络·reactor·nio
重庆大傑7 个月前
Socket 原理和思考
java·reactor·socket·nio