gRPC - Use of ContextPropagatingExecutorService and currentContextExecutor(GRPC-使用ContextPropagatingExecutorService和CurentConextExecutor)
问题描述
由于GRPC在新线程上进行服务调用,并且GRPC上下文是线程本地的,我如何传播此GRPC上下文?我发现可以使用Conext.currentContextExecutor()和ConextPropagatingExecutorService,但我没有找到足够的资源或示例来支持这两个选项。有人能帮助实施这些吗?
推荐答案
客户端侦听器不应更改应用程序看到的上下文实例。无论是使用阻塞、异步还是将来的存根,以及阻塞API将无法更改当前上下文,上下文行为都不应真正更改。
虽然拦截器可以自由地修改上下文中预先存在的(可变)值,但通常不需要这样做。通常,在每个RPC中创建一个新的拦截器实例并直接与拦截器通信,或通过自定义的CallOption进行通信更容易。如果您只有一个需要访问响应头的调用站点,那么MetadataUtils.newCaptureMetadataInterceptor()
是获取元数据的一种方便(尽管迂回)的方法。它是为测试而设计的,但适用于测试情况之外的小规模使用。
AtomicReference<Metadata> headers = new AtomicReference<>();
AtomicReference<Metadata> trailers = new AtomicReference<>();
// Using blocking for simplicity, but applies equally to futures
stub.withInterceptors(MetadataUtils.newCaptureMetadataInterceptor(headers, trailers))
.someRpc();
Metadata headersSeen = headers.get();
如果需要从多个调用点访问相同的标头,最好创建一个执行所需操作的自定义侦听器。
CustomInterceptor interceptor = new CustomInterceptor();
stub.withInterceptors(interceptor)
.someRpc();
... = interceptor.getWhateverValue();
这是在演示一个通用用例。特定实例通常可以进一步调整接口,使其更方便、更自然。
这篇关于GRPC-使用ContextPropagatingExecutorService和CurentConextExecutor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:GRPC-使用ContextPropagatingExecutorService和CurentConextExecutor
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01
- 获取数字的最后一位 2022-01-01
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- 转换 ldap 日期 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
- Eclipse 的最佳 XML 编辑器 2022-01-01