当前位置: 首页 > article >正文

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

1. pom中需要先增加如下的内容

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>context-propagation</artifactId>
    <version>1.1.2</version>
</dependency>

2. 注意,要看idea是否将context-propagation引入了。我的idea就是不知道为什么,虽然pom中添加了这个maven,mvn clean install 也通过了,但是在idea中的三方库就是没有。我进行了手动引入

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

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();
    }
}

4. 使用

   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);
    }


http://www.kler.cn/a/470903.html

相关文章:

  • 【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来
  • 基于RedHat9部署WordPress+WooCommerce架设购物网站
  • Vue2移动端(H5项目)项目封装switch组件支持动态设置开启关闭背景色、值及组件内显示文字描述、禁用、switch 的宽度
  • 人工智能训练师一级(高级技师)、二级(技师)考试指南
  • Mysql--基础篇--函数(字符串函数,日期函数,数值函数,聚合函数,自定义函数及与存储过程的区别等)
  • 新一代智能工控系统网络安全合规解决方案
  • 基于32单片机的智能语音家居
  • pytest日志显示
  • gesp(C++一级)(18)洛谷:B4063:[GESP202412 一级] 奇数和偶数
  • 某制造集团灯塔工厂解决方案(36页PPT)
  • 安装vue脚手架出现的一系列问题
  • 计算机网络——网络层—路由算法和路由协议
  • 感知器的那些事
  • springboot适配mybatis+guassdb与Mysql兼容性问题处理
  • 升级 Spring Boot 3 配置讲解 —— Spring Boot 3 核心源码专讲
  • 如何在 Ubuntu 22.04 上安装 Nagios 服务器教程
  • Flutter:打包apk,安卓版本更新(二)
  • 使用Python构建远程医疗平台:从零开始的实现指南
  • 【错误记录】HarmonyOS 编译报错 ( DevEco Studio 开发环境 与 API 版本 与 HarmonyOS 版本 的配套关系 )
  • 君正T41交叉编译ffmpeg、opencv并做h264软解,利用君正SDK做h264硬件编码
  • Angular由一个bug说起之十三:Cross Origin
  • C++二十三种设计模式之外观模式
  • Nginx不使用域名如何配置证书
  • 谷歌浏览器的高级开发者工具使用指南
  • Ubuntu下安装Android Sdk
  • HarmonyOS NEXT 应用开发练习:AI智能语音播报