【发布时间】:2021-05-01 03:46:09
【问题描述】:
我想覆盖ServerInterceptor 中的sendMessage、sendHeaders、onMessage、onHalfClose 方法(使用Context):
val context = Context.current().withValue(TestConstants.CONTEXT_KEY, "testValue1")
val delegatedCall = object : SimpleForwardingServerCall<ReqT, RespT>(call) {
override fun sendMessage(message: RespT) {
this@SimpleServerInterceptor.sendMessage(message)
super.sendMessage(message)
}
override fun sendHeaders(headers: Metadata) {
this@SimpleServerInterceptor.sendHeaders(headers)
super.sendHeaders(headers)
}
override fun close(status: Status, trailers: Metadata) {
this@SimpleServerInterceptor.close(status, trailers)
super.close(status, trailers)
}
}
val delegatedListener: ServerCall.Listener<ReqT> =
if (context === null)
next.startCall(delegatedCall, headers)
else
Contexts.interceptCall(context, delegatedCall, headers, next)
return object : ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(delegatedListener) {
override fun onMessage(message: ReqT) {
this@SimpleServerInterceptor.onMessage(message, headers)
super.onMessage(message)
}
override fun onHalfClose() {
this@SimpleServerInterceptor.onHalfClose(headers)
super.onHalfClose()
}
override fun onCancel() {
this@SimpleServerInterceptor.onCancel(headers)
super.onCancel()
}
override fun onComplete() {
this@SimpleServerInterceptor.onComplete(headers)
super.onComplete()
}
override fun onReady() {
this@SimpleServerInterceptor.onReady(headers)
super.onReady()
}
}
这是输出:
>>>>intercept1
>>>>intercept2: testValue1
>>>>onReady1: null
>>>>onMessage1: null
>>>>onHalfClose1: null
HelloService3.hello: testValue1
>>>>sendHeaders2: testValue1
>>>>sendHeaders1: testValue1
>>>>sendMessage2: testValue1
>>>>sendMessage1: testValue1
可以看到Context对delegatedCall(sendMessage,sendHeaders)有效,但对delegatedListener(onMessage,onHalfClose)无效。
为什么以及如何解决这个问题?
【问题讨论】:
-
ReqT和RespT是如何定义的? -
@MichielLeegwater 只使用 gRPC 默认,没有定义
标签: java kotlin grpc grpc-java grpc-kotlin