grpc java - 迭代 Context.keyValueEntries?
grpc java - iterate 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();
但要求更通用,键名直到运行时都是未知的。
在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>>
键中。
我是 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();
但要求更通用,键名直到运行时都是未知的。
在ServerInterceptor
for (String key : metadata.keys())
可以迭代所有键和值。
但是 SOME_GENERIC_KEY.get()
的通用版本是什么?我试过 Context.current().keyValueEntries
但无法编译(不是 public)。
我搜索并阅读了
但是其中 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>>
键中。