首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServerInterceptor中的grpc-java异步调用

ServerInterceptor中的grpc-java异步调用
EN

Stack Overflow用户
提问于 2018-12-06 12:00:53
回答 1查看 1.7K关注 0票数 7

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

代码语言:javascript
复制
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进行异步调用,如果不能执行,异步验证请求grpc的正确方法是什么?我知道可以通过StreamObservers直接在grpc服务中实现这一点,但是请求授权是一个横切的关注点,拦截器似乎是一个非常适合它的地方。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-06 17:23:36

您确实需要返回一个ServerCall.Listener。但是,由于您不知道要委托的Listener,所以可以覆盖Listener中的每个方法来将回调添加到队列中。完成身份验证后,释放队列。

代码语言:javascript
复制
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;
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53651024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档