grpc java - 迭代 Context.keyValueEntries?

grpc java - iterate 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();

但要求更通用,键名直到运行时都是未知的。

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

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

我搜索并阅读了 2 3

但是其中 none 提供了解决方案(针对这个问题)。

谁能帮忙,谢谢!

But what is generic version of SOME_GENERIC_KEY.get()? I tried Context.current().keyValueEntries but cannot compile(not public).

Context 故意不允许迭代键,因为这允许使用 Java 可见性来限制对 setting/getting 特定键的访问。这会产生与 ThreadLocal 相似的结果。密钥使用 Java-default 身份相等性 (k1 == k2),传递给 Context.key(KEY_KNOWN) 的字符串是 debug 字符串,在 get() 期间未使用.

虽然 Context 是一个 Map-like 数据结构,但它并不是一个 general-purpose 映射,因为它是不可变的,并且存储许多相关的键最好使用普通的 HashMap 或 POJO。

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