【问题标题】:gRPC Context return null when I use SimpleForwardingServerCallListener当我使用 SimpleForwardingServerCallListener 时,gRPC 上下文返回 null
【发布时间】:2021-05-01 03:46:09
【问题描述】:

我想覆盖ServerInterceptor 中的sendMessagesendHeadersonMessageonHalfClose 方法(使用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

可以看到ContextdelegatedCall(sendMessage,sendHeaders)有效,但对delegatedListener(onMessage,onHalfClose)无效。

为什么以及如何解决这个问题?

【问题讨论】:

  • ReqTRespT 是如何定义的?
  • @MichielLeegwater 只使用 gRPC 默认,没有定义

标签: java kotlin grpc grpc-java grpc-kotlin


【解决方案1】:

我认为问题在于 那个特定的 SimpleForwardingServerCallListener 没有看到更改,因为它在Contexts.interceptCall() 内的侦听器之前执行。 Listener 用于回调,因此它们由 gRPC 调用。 gRPC 将调用返回的侦听器,该侦听器最终将调用delegatedListenerdelegatedListener 是进行上下文调整的那个。 Contexts.interceptCall() 根本不会改变 call,因此调用看到上下文这一事实意味着监听器必须正常工作。

我建议创建一个ServerCallHandler 来执行对SimpleServerInterceptor 的所有调用并将该处理程序传递给Contexts.interceptCall()

(只是一个草图,因为我对 Kotlin 不熟悉)

val context = Context.current().withValue(TestConstants.CONTEXT_KEY, "testValue1")
if (context === null) // Unclear how this will be null
    return next.startCall(delegatedCall, headers)
else
    return Contexts.interceptCall(context, delegatedCall, headers, new SimpleServerInterceptorHandler(next))

...

// Within SimpleServerInterceptorHandler
val delegatedCall = object : SimpleForwardingServerCall<ReqT, RespT>(call) {
  ...
}
val delegatedListener: ServerCall.Listener<ReqT> =
        next.startCall(delegatedCall, headers)
return object : ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(delegatedListener) {
  ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多