2017-06-27 15 views
0

gRPCサービスで2つのServerInterceptorをバインドします。最初のServerInterceptroでServerCallが終了したときに、残りのgRPC(java)ServerInterceptorを無視する方法はありますか?

最初のインターセプタでは、ServerCallは閉じられていますが、2番目のインターセプタはまだ関与しています。

ServerCallが最初のインターセプタで閉じられている間、残りのインターセプタをスキップする方法はありますか?

最初のインターセプター:

public class FirstInterceptor implements ServerInterceptor { 

     @Override 
     public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
      ServerCall<ReqT, RespT> call, 
      Metadata headers, 
      ServerCallHandler<ReqT, RespT> next) { 

      if(...){ 
       ... 
       return Contexts.interceptCall(context, call, headers, next); 
      }else{ 
       ... 
       call.close(Status.UNAUTHENTICATED.withDescription("@FST_INTCP"),GrpcUtil.getMetadataWithErrMsg(e)); 
       return next.startCall(new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {}, headers); 
      } 
     } 
} 

答えて

1

インターセプタは、nextに電話する必要はありません。 interceptCall()の間にServerCallを閉じている場合、nextに電話する必要はありません。これは、チェーン内の他のものが応答できないためです。

ので、コードは次のようになります。

public class FirstInterceptor implements ServerInterceptor { 
    @Override 
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
      ServerCall<ReqT, RespT> call, 
      Metadata headers, 
      ServerCallHandler<ReqT, RespT> next) { 
     if(...) { 
      ... 
      return Contexts.interceptCall(context, call, headers, next); 
     } else { 
      ... 
      call.close(Status.UNAUTHENTICATED.withDescription("@FST_INTCP"), 
       GrpcUtil.getMetadataWithErrMsg(e)); 
      return new ServerCall.Listener() {}; 
     } 
    } 
} 
1

インターセプタが連鎖しているので、あなたがリスナーからのclosingイベントを取得することができます。

ServerCall.Listener<ReqT> delegate = Contexts.interceptCall(context, call, headers, next); 
return new SimpleForwardingServerCallListener<ReqT>(delegate) { 
    boolean cancelled; 
    @Override 
    void onCancel() { 
    cancelled = true; 
    } 

    @Override 
    void onMessage(Req req) { 
    if (cancelled) { 
     return; 
    } 
    // normal logic here. 
    } 
} 

SimpleForwardingServerCallListenerを参照してください。代わりに、直接あなたが次から取得ServerCall.Listenerを返す、あなたは新しいデリゲートを作成することができます。

ServerCallについては、他の方向に進むSimpleForwardingServerCallを使用して同様のことを行うことができます。

関連する問題