如何在 onNext 调用中从上下文/范围中获取变量? (java/grpc)

2024-01-13

我正在与contexts https://grpc.io/grpc-java/javadoc/io/grpc/Contexts.html within grpc/java https://github.com/grpc/grpc-java.

我最终试图

1) 从每个传入请求中获取作为标头附加的元数据(cred 元数据)

2)将其附加到 grpc 范围/上下文,以便当请求传入服务器端时我可以访问它。

这是一种解决办法,因为我无法按照我的意愿更改 API。尽管如此,我还是定义了一个拦截器,它将剥离每个传入请求的元数据。

public class OnBehalfOfInterceptor implements ServerInterceptor {

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
       final ServerCall<ReqT, RespT> call,
       final Metadata headers,
       final ServerCallHandler<ReqT, RespT> next
    ) {

        Context ctx = Context.current();

        String mayDelegate = headers.get(
            Metadata.Key.of("may-delegate", Metadata.ASCII_STRING_MARSHALLER)
        );
        String onBehalfOf;

        if (mayDelegate != null && str2bool(mayDelegate)) {
            onBehalfOf = headers.get(
                Metadata.Key.of("on-behalf-of", Metadata.ASCII_STRING_MARSHALLER)
            );
            ctx = ctx.withValue(
                    Context.key("on-behalf-of"),
                    onBehalfOf
            );
        }

        return Contexts.interceptCall(ctx, call, headers, next);
    }

}

此代码尝试查找“代表”字符串,如果找到,则将其附加到当前上下文。

现在,当我去调试当前上下文时,我可以看到以下输出

Context.current().keyValueEntries.root.values[1]

result
    key "on-behalf-of"
    value "my id"

这是 .onNext() 调用内的调试输出,我能够看到我认为应该能够看到的上下文变量。但是,当我不在调试运行时环境中时,我无法获取“keyValueEntries”。我猜测它是调试器提供的东西,不一定是 Context 类的成员。

那么...我如何正确访问附加到当前上下文的变量?我尝试了几个不同的示例并通过它们进行了调试。

Context.current().get(Context.key("on-behalf-of"))

// this ^ returns null

我只是在想这个错误吗?有没有更简单的方法来从传入请求中获取元数据?


Context.Key使用引用相等。你应该使用相同的Key两个位置的实例。传递的字符串只是一个调试字符串。正如所写文档 https://grpc.io/grpc-java/javadoc/io/grpc/Context.html#key-java.lang.String-:

使用给定的调试名称创建 Context.Key。多个不同的键可能具有相同的名称;该名称用于调试目的,不会影响行为。

使用引用相等意味着您可以使用 Java 可见性限制来限制哪些代码可以访问上下文状态,就像使用ThreadLocal.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 onNext 调用中从上下文/范围中获取变量? (java/grpc) 的相关文章

  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • 使用 Spring MVC 在 jar 文件中显示 jsp 页面

    我正在使用 Spring MVC 3 2 2 在 java 中开发一个 Web 应用程序 我在从 jar 文件中加载 jsp 页面时遇到问题 Spring MVC Web应用程序具有以下结构 META INF WEB INF spring
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) libwebviewchromium.so

    对于 android 4 4 我多次收到 Native crash at system lib libwebviewchromium so 错误 以下是设备包括 Xperia Z1 SO 01F 16 30 2 Galaxy Tab4 7
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • 在 Eclipse 中删除空块之前的新行

    我更喜欢奥尔曼式 http en wikipedia org wiki Brace style Allman style大括号 例如 if foo magical prancing unicorn stuff 而不是 if foo unma
  • 生成一定长度的所有排列

    假设我们有一个字母表 abcdefghiklimnop 如何以有效的方式以五个一组的形式重复该字母表来递归生成排列 几天来我一直在为此苦苦挣扎 任何反馈都会有帮助 本质上这与 生成给定字符串的所有排列 https stackoverflow
  • 我的 Kafka 流应用程序刚刚退出,代码为 0,什么也不做

    为了尝试 Kafka 流 我这样做了 public static void main String args final StreamsBuilder builder new StreamsBuilder final Properties
  • java彩色滚动条搜索结果

    我将如何在 Java 中自定义滚动条 以便我可以进行像 chrome 一样的搜索 也就是说在结果所在的位置放置彩色条纹 我不想要一个库 因为我更喜欢自己编写代码 另外 我不想失去我拥有的 L F 欢迎举例 实际上 它将查看一个大的文本文件或
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • BigDecimal汇总统计

    我有一个 BigDecimal 列表 List
  • 如何在 JmsMessagingTemplate.sendAndReceive 上设置等待超时

    我在 MVC 控制器中使用 JmsMessagingTemplate 的 sendAndReceive 但如果没有发送回复消息 它似乎会永远等待回复 该文档指出 返回 回复 如果无法接收消息 例如由于超时 则可能为 null 然而 我只是不
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 在约束验证器中使用 Guice 进行依赖注入

    我有一个在 ConstraintValidator 的实现中注入类的用例 我正在使用 Google guice 进行依赖项注入 目前无法在验证器内注入 我的场景的简化形式 内部模块 Provides Singleton public Ser
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github

随机推荐