我们有一个自定义ServerInterceptor
用于记录我们的grpc-java服务器收到的每个调用。它将ServerCall
传递给next::startCall
,其中SimpleForwardingServerCall
覆盖close(Status,Metadata)
,用于记录呼叫状态并跟踪interceptCall
和{之间经过的总时间{1}}。我们希望这会导致记录状态并跟踪每次收到的呼叫的已用时间。
我们发现了一个案例,我们的拦截器记录在close
的主体中,然后内部拦截器在其interceptCall
中进行了一些记录,但是我们从未看到任何更多的日志记录请求。其他上下文表明当时客户端和服务器之间存在连接问题。
我们是否可以期望为每个RPC调用调用interceptCall
,无论客户端或连接错误行为如何?如果没有,是否还有其他一些我们可能错过的回调,表明通话已经死了?"
答案 0 :(得分:2)
您需要ServerCall.Listener.onComplete()
和ServerCall.Listener.onCancel()
。成功处理onComplete()
后调用ServerCall.close()
。 onCancel()
用于任何通信错误或取消。请注意,在应用程序调用{{1}}之后,可以接收onCancel()
。