serverinterceptor中的grpc java异步调用

7jmck4yq  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(608)

我有一个grpcjava服务器,需要在处理请求之前对auth服务进行异步调用。我认为这应该在拦截器中完成,但它需要从interceptcall()同步返回侦听器

class AuthInterceptor implements ServerInterceptor {

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
        ServerCall<ReqT, RespT> call,
        Metadata headers,
        ServerCallHandler<ReqT, RespT> next
    ) {
        String token = ""; //get token from headers
        authService.authorize(token).subscribe(
            ok -> // process the request
            error -> call.close(Status.UNAUTHENTICATED, headers)
        );
        // Here we need to return a Listener, but we haven't started a call yet
    }
}

因此,问题是:如何从serverinterceptor发出异步调用,如果不能这样做,那么什么是正确的方法来异步验证请求呢?我知道可以通过streamobservators直接在grpc服务中完成,但是请求授权是一个跨领域的问题,拦截器似乎是一个完美的地方。

rbpvctlc

rbpvctlc1#

你确实需要退票 ServerCall.Listener . 但既然你不知道 Listener 要委托给,可以重写 Listener 将回调添加到队列。身份验证完成后,排空队列。

class DelayedListener<ReqT> extends Listener<ReqT> {
  private Listener<ReqT> delegate;
  private List<Runnable> events = new ArrayList<Runnable>();

  @Override public synchronized void onMessage(ReqT message) {
    if (delegate == null) {
      events.add(() -> delegate.onMessage(message));
    } else {
      delegate.onMessage(message);
    }
  }
  ...
  public synchronized void setDelegate(Listener<ReqT> delegate) {
    this.delegate = delegate;
    for (Runnable runnable : events) {
      runnable.run();
    }
    events = null;
  }
}

相关问题