HSF异步调用

来源:互联网 发布:vb实例150例 函数调用 编辑:程序博客网 时间:2024/06/16 12:23

1.引入

          按照前面的配置、使用方式,实际上使用的是hsf的同步调用,也就是客户端一直等待服务端返回结果。

          但是有些是不需要一直等待服务端返回结果的,对于这些服务,hsf提供异步调用的方式,让客户端不必同步阻塞在hsf操作上


2.异步调用

          (1)说明

                    异步调用在发起调用时,HSF service的调用结果都是返回值的默认值,如返回类型是int,则会返回0;返回类型是Object,则会返回null。

                    而真正的结果,是在HSFResponseFuture或者回调函数中获得的。


          (2)Future调用

                     HSF的Future调用类似于JDK的Future,通过HSFResponseFuture.getResponse(int timeout)拿到调用结果

                     1)在HSFSpringConsumerBean中配置asyncallMethods参数

<bean id="helloService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean"init-method="init"><property name="interfaceName"><value>com.hsf.HelloWorldService</value></property><property name="version"><value>1.0.0.cpf</value></property><property name="asyncallMethods"><list><!--future 的含义为通过 Future 的方式去获取请求执行的结果,例如先调用下远程的接 口,接着继续做别的事情,然后再通过 Future 来获取结果 --><value>name:sayHello;type:future</value></list></property></bean>
                     2)调用方法

// 发起调用String helloString = helloService.sayHello("lanshan"); //这里返回的 helloString其实是 null//do something else//获取结果helloString = HSFResponseFuture.getResponse(-1);//这里才是真正的返回结果System.out.println(helloString);

          (3)Callback调用

                     HSF服务拿到结果后,会回调用户的接口,所以这里需要用户实现HSFResponseCallback接口

                     1)添加依赖,scope写成provided

<dependency><groupId>com.taobao.hsf</groupId><artifactId>hsf.app.spring</artifactId><version>2.0.1.7</version><scope>provided</scope></dependency>
                     2)在配置ConsumerBean的时候,和Future调用一样,要写明异步方法

<bean id="helloService" class="com.taobao.hsf.app.spring.util.HSFSpringConsumerBean"init-method="init"><property name="interfaceName"><value>com.hsf.HelloWorldService</value></property><property name="version"><value>1.0.0.cpf</value></property><property name="asyncallMethods"><list>      <value>name:sayHello;type:callback;listener:com.hsf.MyCallbackListener</value> </list></property></bean>
                     3)实现HSFResponseCallback接口,真正执行的逻辑在onAppResponse()方法里
package com.hsf;import com.taobao.hsf.exception.HSFException;import com.taobao.hsf.tbremoting.invoke.CallbackInvocationContext;import com.taobao.hsf.tbremoting.invoke.HSFResponseCallback;public class MyCallbackListener implements HSFResponseCallback {@Overridepublic void onAppException(Throwable arg0) {// TODO Auto-generated method stub}@Overridepublic void onAppResponse(Object appResponse) {System.out.println("callback invoke:" + appResponse + "I can use biz Object:"                + CallbackInvocationContext.getContext());}@Overridepublic void onHSFException(HSFException arg0) {// TODO Auto-generated method stub}}

                     4)调用代码

@Testpublic void test() throws InterruptedException {//必须放在第一句//第一个参数指定hsf所在路径,第二个参数表示版本号HSFEasyStarter.start("d:/hsf/", "1.4.9.5");ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");HelloWorldService service = (HelloWorldService) ctx.getBean("helloService");//必须写上,因为需要等待服务发布ServiceUtil.waitServiceReady(service);Thread.sleep(9000);service.sayHello("cpf");}

0 0