java - grpc java - 迭代 Context.keyValueEntries?
问题描述
我是 grpc 的新手,正在开发我们的服务器端 grpc 代码。
最终目标是“将与元数据中特定模式匹配的所有变量传递给子调用”。
第一步是获取这些键值。
现在我可以获得任何固定的(在编译时已知的)键值对:
创建一个
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 } }
在其他代码中:
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
但无法编译(不公开)。
但他们都没有提供解决方案(这个问题)。
谁能帮忙,谢谢!
解决方案
但是 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>>
键中。