【问题标题】:How to access message request in gRPC interceptor?如何在 gRPC 拦截器中访问消息请求?
【发布时间】:2018-05-31 01:06:39
【问题描述】:

我想在服务器端为多个方法使用相同的拦截器 因为它们都具有相同的请求类型(StateRequest):

rpc apply (StateRequest) returns (StateResponse) {} 
rpc cancel (StateRequest) returns (StateResponse) {}
rpc remove (StateRequest) returns (StateResponse) {}
rpc development (StateRequest) returns (StateResponse) {}
rpc implement (StateRequest) returns (StateResponse) {}
rpc draft (StateRequest) returns (StateResponse) {}

拦截器:

public class ServerUserRoleAuthInterceptor implements ServerInterceptor {

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
        ServerCall<ReqT, RespT> call,
        Metadata headers,
        ServerCallHandler<ReqT, RespT> next) {
        String callName = call.getMethodDescriptor().getFullMethodName();
        logger.info("Call: {}", callName);

        // TODO: validate request (`StateRequest` instance)

        return next.startCall(call, headers);
    }
}

我该怎么做?

【问题讨论】:

    标签: java rpc interceptor grpc


    【解决方案1】:

    你需要观察Listener上的onMessage(ReqT)回调。

    return new SimpleForwardingServerCallListener<ReqT>(next.startCall(call, headers)) {
      @Override 
      public void onMessage(ReqT request) {
        // TODO:validate request
        super.onMessage(request);
      }
    };
    

    【讨论】:

    • public void onMessage(ReqT message) - 它不能抛出异常。我只需要抛出 RuntimeException 吗(比如说StatusRuntimeException?)
    • 你不应该在拦截器中抛出。相反,请致电serverCall.close(...)
    • next.startCall() 将在onMessage() 之前被调用。有没有机会先调用onMessage(),因为我需要在下一个拦截器开始工作之前根据消息内容调整上下文?
    • @4ntoine,您不能选择入站回调顺序。但您可以延迟拨打next,直到收到onMessage()
    • 我该如何延迟next?下一个拦截器在interceptCall() 中有它自己的逻辑,它会立即被调用。
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2018-04-19
    相关资源
    最近更新 更多