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

时间:2019-07-18 15:45:13

标签: 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);
}

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

Context.Key<String> key = Context.key("USER");
String value = key.get(Context.current())

每次的值为空。但是,在intellij中进行调试时,我可以在context.current().keyValueEntries中将这些值视为

CompressedIndex(bitmap=100001000000000000000000000000 Leaf(key=USER value=chandan) Leaf(key=opencensus-trace-span-key value=BlankSpan) )

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

1 个答案:

答案 0 :(得分:1)

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

由于Context.Key使用引用相等,因此可以使用常规Java可见性限制来限制谁可以访问该值,就像使用ThreadLocal一样。