调用方式

SOFARPC 提供了多种调用方式满足不同的场景。

同步

同步调用方式,客户端发起调用后会等待服务端返回结果再进行后续的操作。这是 SOFARPC 的默认调用方式,无需进行任何设置即可。

异步

客户端发起调用后不会等到服务端的结果,继续执行后面的业务逻辑。服务端返回的结果会被 SOFARPC 缓存,当客户端需要结果的时候,需要主动获取。
API 方式如下:

  1. ConsumerConfig<HelloService> consumer = new ConsumerConfig<HelloService>()
  2. .setInterfaceId(HelloService.class.getName())
  3. .setInvokeType(RpcConstants.INVOKER_TYPE_FUTURE);

在 SOFABoot 中如下配置:

  1. <sofa:reference id="sampleFacadeReferenceBolt" interface="com.alipay.sofa.rpc.bean.SampleFacade" >
  2. <sofa:binding.bolt>
  3. <sofa:global-attrs type="future"/>
  4. </sofa:binding.bolt>
  5. </sofa:reference>

如上设置为异步调用的方式。
获取结果有两种方式:

  • 直接获取结果。
    第一个参数是获取结果的超时时间,第二个参数表示是否清除线程上下文中的结果。
    1. String result = (String)SofaResponseFuture.getResponse(0,true);
  • 获取原生Futrue
    该种方式会获取jdk原生的Future,参数表示是否清除线程上下文中的结果。
    1. Future future = SofaResponseFuture.getFuture(true);
    在 SOFABoot 中如下配置:
    1. <sofa:reference id="sampleFacadeReferenceBolt" interface="com.alipay.sofa.rpc.bean.SampleFacade">
    2. <sofa:binding.bolt>
    3. <sofa:global-attrs type="future"/>
    4. </sofa:binding.bolt>
    5. </sofa:reference>

回调

客户端提前设置一个回调实现类,在发起调用后不会等待结果。 SOFA-RPC 在获取到服务端的接口后会自动执行该回调实现。
客户端回调类需要实现 com.alipay.sofa.rpc.core.invoke.SofaResponseCallback 接口
API 方式如下:

  1. SofaResponseCallback sofaResponseCallbackImpl = new SofaResponseCallbackImpl();
  2. ConsumerConfig<HelloService> consumer = new ConsumerConfig<HelloService>()
  3. .setInterfaceId(HelloService.class.getName())
  4. .setInvokeType(RpcConstants.INVOKER_TYPE_CALLBACK)
  5. .setOnReturn(sofaResponseCallbackImpl)

这是服务级别的设置,也可以进行调用级别的设置。

  1. RpcInvokeContext.getContext().setResponseCallback(sofaResponseCallbackImpl);

在 SOFABoot 中如下配置:

  1. <bean id="callback" class="xxx.xxx.sofaResponseCallbackImpl"/>
  2. <sofa:reference id="sampleFacadeReferenceBolt" interface="com.alipay.sofa.rpc.bean.SampleFacade">
  3. <sofa:binding.bolt>
  4. <sofa:global-attrs type="callback" callback-ref="callback"/>
  5. </sofa:binding.bolt>
  6. </sofa:reference>

单向

客户端发送请求后不会等待服务端返回的结果,并且会忽略服务端的处理结果。
API 方式如下:

  1. ConsumerConfig<HelloService> consumer = new ConsumerConfig<HelloService>()
  2. .setInterfaceId(HelloService.class.getName())
  3. .setInvokeType(RpcConstants.INVOKER_TYPE_ONEWAY);

在 SOFABoot 中如下配置:

  1. <bean id="callback" class="xxx"/>
  2. <sofa:reference id="sampleFacadeReferenceBolt" interface="com.alipay.sofa.rpc.bean.SampleFacade" local-first="false">
  3. <sofa:binding.bolt>
  4. <sofa:global-attrs type="oneway"/>
  5. </sofa:binding.bolt>
  6. </sofa:reference>