【问题标题】:How to Access attributes from grpc Context.current()?如何从 grpc Context.current() 访问属性?
【发布时间】:2019-07-18 15:45:13
【问题描述】:

是否可以从 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) )

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

【问题讨论】:

    标签: protocol-buffers grpc grpc-java protobuf-java


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2017-07-26
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多