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 {
@Override
public void onAppException(Throwable arg0)
{
// TODO Auto-generated method stub
}
@Override
public void onAppResponse(Object appResponse) {
System.out.println("callback invoke:" + appResponse + "I can use biz Object:"
+ CallbackInvocationContext.getContext());
}
@Override
public void onHSFException(HSFException arg0) {
// TODO Auto-generated method stub
}
}
4)调用代码
@Test
public 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");
}