public class AddToContextInterceptor implements ServerInterceptor {
// Context keys use reference equality, so the consumer of the value
// must use this specific object.
public static final Context.Key<MyObject> MY_KEY = Context.key("MY_KEY");
@Override
public <ReqT,RespT> ServerCall.Listener<ReqT> interceptCall(
ServerCall<ReqT,RespT> call, Metadata headers,
ServerCallHandler<ReqT,RespT> next) {
Context newContext =
Context.current().withValue(MY_KEY, metadata.get(SOME_KEY));
return Contexts.interceptCall(newContext, call, headers, next);
}
}
// In the service:
MyObject o = AddToContextInterceptor.MY_KEY.get();
1条答案
按热度按时间rlcwz9us1#
使用
io.grpc.Context
将值传播到服务实现,使用Contexts.interceptCall()
。jwt-auth示例以及其他一些StackOverflow questionsandanswers执行此操作。本质上,您只需创建一个包含您想要通信的信息的新Context,并使用
Contexts.interceptCall()
将其作为ThreadLocal提供给服务。如果您的服务在另一个线程上进行处理,则需要将Context传播到另一个线程或提前保存值。