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);
    }
相关推荐
tod11315 天前
Reactor反应堆模式
网络·网络协议·tcp/ip·reactor·多路转接·tcpdump
带刺的坐椅16 天前
赋予 AI Agent “无限续航”:语义保护型上下文压缩技术解析
ai·llm·reactor·agent·solon·solon-ai
乾坤瞬间21 天前
Reactor核心机制:本质的信号传递流程源码到实战
reactor·异步非堵塞
阿湯哥1 个月前
Reactor响应式编程中Sinks.Many
java·reactor
太阳伞下的阿呆1 个月前
Reactor线程池切换publishOn与subscribeOn
reactor·高并发·响应式编程·异步
无小道1 个月前
基于epoll的单进程Reactor服务器
运维·服务器·c++·网络编程·reactor·epoll
enjoy编程2 个月前
Spring boot 4 探究netty的关键知识点
spring boot·设计模式·reactor·netty·多线程
Ronin3052 个月前
【Linux网络】基于Reactor反应堆模式的高并发服务器
linux·网络·reactor·epoll·非阻塞·et模式·高并发服务器
wanghowie2 个月前
02.04.02 Reactor 实战教程:响应式编程从入门到精通
java·reactor
cccyi73 个月前
高级I/O编程:从Select、Poll到Epoll的演进与Reactor服务器实现
服务器·c++·reactor