如何从 grpc Context.current() 访问属性?

cha*_*dan 2 protocol-buffers grpc grpc-java protobuf-java

是否可以从 rpc 方法定义访问 grpc 调用的上下文属性?

我写了一个类似于这个的服务器拦截器

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

   Context.Key<String> USER = Context.key("USER");
 
  Context ctx = Context.current().withValue(USER, "chandan");
  return Contexts.interceptCall(ctx, call, requestHeaders, next);
}
Run Code Online (Sandbox Code Playgroud)

在服务实现中,我正在尝试类似的东西

Context.Key<String> key = Context.key("USER");
String value = key.get(Context.current())
Run Code Online (Sandbox Code Playgroud)

每次值为空。但是在调试中的IntelliJ我可以在看到那些值context.current().keyValueEntries作为

CompressedIndex(bitmap=100001000000000000000000000000 Leaf(key=USER value=chandan) Leaf(key=opencensus-trace-span-key value=BlankSpan) )
Run Code Online (Sandbox Code Playgroud)

我如何访问上下文属性/正确的方法是什么?

Eri*_*son 5

Context.Key使用引用相等。该"USER"字符串是toString()输出中使用的调试字符串。您应该创建Key一次并在任何需要它的地方引用该实例。

因为Context.Key使用引用相等,您可以使用普通的 Java 可见性限制来限制谁可以访问该值,就像您可以使用ThreadLocal.