首页 > 解决方案 > grpc java - 迭代 Context.keyValueEntries?

问题描述

我是 grpc 的新手,正在开发我们的服务器端 grpc 代码。

最终目标是“将与元数据中特定模式匹配的所有变量传递给子调用”。

第一步是获取这些键值。

现在我可以获得任何固定的(在编译时已知的)键值对:

  1. 创建一个ServerInterceptor

    public class HeaderInterceptor implements ServerInterceptor{
      private static final String KEY_KNOWN = "AT_COMPILE_TIME";
      private static final Metadata.Key<String> METADATA_KEY = 
          Metadata.Key.of(KEY_KNOWN, Metadata.ASCII_STRING_MARSHALLER);
      public static final Context.Key<String> CONTEXT_KEY = 
          Context.key(KEY_KNOWN);
    
      @Override
      public <REQT, RESPT> Listener<REQT> interceptCall(
          ServerCall<REQT, RESPT> call, 
          Metadata metadata,
          ServerCallHandler<REQT, RESPT> next) {
              Context context = Context.current().withValue(
                  CONTEXT_KEY, 
                  metadata.get(METADATA_KEY));
         //...some other code
        }
    }
    
    
    
  2. 在其他代码中:

        import static some.package.HeaderInterceptor.CONTEXT_KEY;
        String value = CONTEXT_KEY.get();

但是要求更通用,并且密钥名称在运行时之前是未知的。

InServerInterceptor
for (String key : metadata.keys())可以迭代所有的键和值。

但是什么是通用版本SOME_GENERIC_KEY.get()?我试过Context.current().keyValueEntries但无法编译(不公开)。

我已经搜索并阅读了1 2 3

但他们都没有提供解决方案(这个问题)。

谁能帮忙,谢谢!

标签: javagrpcgrpc-java

解决方案


但是 SOME_GENERIC_KEY.get() 的通用版本是什么?我尝试了 Context.current().keyValueEntries 但无法编译(不公开)。

Context故意不允许对键进行迭代,因为这允许使用 Java 可见性来限制对设置/获取特定键的访问。这会产生与 类似的结果ThreadLocal。键使用 Java-default 等式 ( k1 == k2),传递给的字符串Context.key(KEY_KNOWN)是 s 期间未使用的调试字符串get()

虽然 Context 是一种类似 Map 的数据结构,但它并不打算用作通用映射,因为它是不可变的,并且使用普通的 HashMap 或 POJO 更好地存储许多相关的键。

那么如何存储许多键,为您在元数据中找到的每个标头存储一个键?使用地图。使用找到的条目创建一个 Map 并将该映射存储在一个Context.Key<Map<String,String>>键中。


推荐阅读