我正在与contexts https://grpc.io/grpc-java/javadoc/io/grpc/Contexts.html within grpc/java https://github.com/grpc/grpc-java.
我最终试图
1) 从每个传入请求中获取作为标头附加的元数据(cred 元数据)
2)将其附加到 grpc 范围/上下文,以便当请求传入服务器端时我可以访问它。
这是一种解决办法,因为我无法按照我的意愿更改 API。尽管如此,我还是定义了一个拦截器,它将剥离每个传入请求的元数据。
public class OnBehalfOfInterceptor implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
final ServerCall<ReqT, RespT> call,
final Metadata headers,
final ServerCallHandler<ReqT, RespT> next
) {
Context ctx = Context.current();
String mayDelegate = headers.get(
Metadata.Key.of("may-delegate", Metadata.ASCII_STRING_MARSHALLER)
);
String onBehalfOf;
if (mayDelegate != null && str2bool(mayDelegate)) {
onBehalfOf = headers.get(
Metadata.Key.of("on-behalf-of", Metadata.ASCII_STRING_MARSHALLER)
);
ctx = ctx.withValue(
Context.key("on-behalf-of"),
onBehalfOf
);
}
return Contexts.interceptCall(ctx, call, headers, next);
}
}
此代码尝试查找“代表”字符串,如果找到,则将其附加到当前上下文。
现在,当我去调试当前上下文时,我可以看到以下输出
Context.current().keyValueEntries.root.values[1]
result
key "on-behalf-of"
value "my id"
这是 .onNext() 调用内的调试输出,我能够看到我认为应该能够看到的上下文变量。但是,当我不在调试运行时环境中时,我无法获取“keyValueEntries”。我猜测它是调试器提供的东西,不一定是 Context 类的成员。
那么...我如何正确访问附加到当前上下文的变量?我尝试了几个不同的示例并通过它们进行了调试。
Context.current().get(Context.key("on-behalf-of"))
// this ^ returns null
我只是在想这个错误吗?有没有更简单的方法来从传入请求中获取元数据?