如何实现Java gRPC客户端拦截器直接返回响应默认实例?
实现返回默认响应的gRPC客户端拦截器
你需要的是一个客户端拦截器,它能在发起网络请求前直接短路,返回对应响应类型的默认实例,完全不会触达服务端。下面是完整的实现代码:
import io.grpc.*; public class GrpcClientRequestInterceptor implements ClientInterceptor { @Override public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall( final MethodDescriptor<ReqT, RespT> methodDescriptor, final CallOptions callOptions, final Channel channel) { return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>( channel.newCall(methodDescriptor, callOptions)) { @Override public void start(Listener<RespT> responseListener, Metadata headers) { // 直接返回响应类型的默认实例,不发起实际调用 responseListener.onMessage(methodDescriptor.getResponseMarshaller().getDefaultInstance()); // 标记调用成功完成 responseListener.onClose(Status.OK, new Metadata()); } }; } }
关键说明:
- 继承
ForwardingClientCall.SimpleForwardingClientCall可以简化自定义ClientCall的实现,无需重写所有方法 - 通过
methodDescriptor.getResponseMarshaller().getDefaultInstance()直接获取对应响应类型的默认实例,无需手动指定类型 - 在
start方法中直接完成响应返回和调用收尾,整个流程完全短路,不会产生任何网络请求
使用方式
将该拦截器注册到gRPC客户端构建器即可生效:
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051) .intercept(new GrpcClientRequestInterceptor()) .usePlaintext() .build();
内容的提问来源于stack exchange,提问作者tuxx
相关产品推荐
相关产品推荐

