当前位置: 首页 > 文档资料 > gRPC 学习笔记 >

Stub层 - 类AbstractStub

优质
小牛编辑
175浏览
2023-12-01

类AbstractStub是stub实现的通用基类。

类AbstractStub也是生成代码中的stub类的通用基类。这个类容许重定义,例如,添加拦截器到stub。

类定义

  1. package io.grpc.stub;
  2. public abstract class AbstractStub<S extends AbstractStub<S>> {
  3. }

属性和构造函数

类AbstractStub有两个属性:

  1. Channel channel
  2. CallOptions callOptions
  1. private final Channel channel;
  2. private final CallOptions callOptions;
  3. protected AbstractStub(Channel channel) {
  4. this(channel, CallOptions.DEFAULT);
  5. }
  6. protected AbstractStub(Channel channel, CallOptions callOptions) {
  7. this.channel = channel;
  8. this.callOptions = callOptions;
  9. }

注: 类CallOptions 的内容见 这里

方法

build()抽象方法

定义了抽象方法build()方法来返回一个新的stub,使用给定的Channel和提供的方法配置。

  1. protected abstract S build(Channel channel, CallOptions callOptions);
  • channel: 返回的新的stub将使用这个Channel来做通讯。
  • callOptions: 运行时调用选项,将被应用于这个stub的每次调用。(也就是说这个不可变的callOptions实例之后将在每次调用中重用)

with方法族

定义有多个with×××()方法,通过创建新的 CallOptions 实例,然后调用上面的build()方法来返回一个新的stub:

  1. public final S withDeadlineNanoTime(@Nullable Long deadlineNanoTime) {
  2. return build(channel, callOptions.withDeadlineNanoTime(deadlineNanoTime));
  3. }
  4. public final S withDeadlineAfter(long duration, TimeUnit unit) {
  5. return build(channel, callOptions.withDeadlineAfter(duration, unit));
  6. }
  7. @ExperimentalApi
  8. public final S withCompression(String compressorName) {
  9. return build(channel, callOptions.withCompression(compressorName));
  10. }

也可以替换使用新的Channel,或者在原有的Channel上添加拦截器:

  1. public final S withChannel(Channel newChannel) {
  2. return build(newChannel, callOptions);
  3. }
  4. public final S withInterceptors(ClientInterceptor... interceptors) {
  5. return build(ClientInterceptors.intercept(channel, interceptors), callOptions);
  6. }