851
微信
HSF 特性使用__服务开发_开发者指南_企业级分布式应用服务 EDAS-阿里云
本文介绍 HSF 一些特性的使用方法及注意事项。
所有特性的实例 Demo 请在这里下载:Demo 下载
前提条件
使用 HSF 相关特性,请在 POM 文件中加入以下 edas-sdk 依赖。
<dependency>
<groupId>com.alibaba.edas</groupId>
<artifactId>edas-sdk</artifactId>
<version>1.5.1</version>
</dependency>
隐式传参(目前仅支持字符串传输)
隐式传参一般用于传递一些简单 KV 数据,又不想通过接口方式传递,类似于 Cookie。
单个参数传递
服务消费者:
RpcContext.getContext().setAttachment("key", "args test");
服务提供者:
String keyVal=RpcContext.getContext().getAttachment("key");
多个参数传递
服务消费者:
Map<String,String> map=new HashMap<String,String>();
map.put("param1", "param1 test");
map.put("param2", "param2 test");
map.put("param3", "param3 test");
map.put("param4", "param4 test");
map.put("param5", "param5 test");
RpcContext rpcContext = RpcContext.getContext();
rpcContext.setAttachments(map);
服务提供者:
Map<String,String> map=rpcContext.getAttachments();
Set<String> set=map.keySet();
for (String key : set) {
System.out.println("map value:"+map.get(key));
}
异步调用
支持异步调用 callback 和 future 两种方式。
callback 调用方式
客户端配置为 callback 方式调用时,需要配置一个实现了 HSFResponseCallback 接口的 listener ,结果返回之后, HSF 会调用 HSFResponseCallback 中的方法。
注意:这个 HSFResponseCallback 接口的 listener 不能是内部类,否则 Pandora 的 classloader 在加载时就会报错。
XML 中的配置:
<hsf:consumer id="demoApi" interface="com.alibaba.demo.api.DemoApi"
version="1.1.2" group="test" >
<hsf:asyncallMethods>
<hsf:method name="ayncTest" type="callback"
listener="com.alibaba.ifree.hsf.consumer.AsynABTestCallbackHandler" />
</hsf:asyncallMethods>
</hsf:consumer>
其中 AsynABTestCallbackHandler 类,是实现了 HSFResponseCallback 接口。DemoApi 接口中有一个方法是 ayncTest 。
代码示例
public void onAppResponse(Object appResponse) {
//这里获取到异步调用后的值
String msg = (String)appResponse;
System.out.println("msg:"+msg);
}
注意:
- 由于只用方法名字来标识方法,所以并不区分重载的方法。同名的方法都会被设置为同样的调用方式。
- 不支持在 call 里再发起 HSF 调用。这种做法可能导致 IO 线程挂起,无法恢复。
future 调用方式
客户端配置为 future 方式调用时,发起调用之后,通过 HSFResponseFuture 中的 public static Object getResponse(long timeout) 来获取返回结果。
XML 中的配置:
<hsf:consumer id="demoApi" interface="com.alibaba.demo.api.DemoApi" version="1.1.2" group="test" >
<hsf:asyncallMethods>
<hsf:method name="ayncTest" type="future" />
</hsf:asyncallMethods>
</hsf:consumer>
代码示例如下。
单个业务异步处理:
//发起调用
demoApi.ayncTest();
// 处理业务
...
//直接获得消息(若无需获得结果,可以不用操作该步骤)
String msg=(String) HSFResponseFuture.getResponse(3000);
多个业务需要并发处理:
若是多个业务需要并发处理,可以先获取 future,进行存储起来,等调用完毕后在使用。
//定义集合
List<HSFFuture> futures = new ArrayList<HSFFuture>();
方法内进行并行调用:
//发起调用
demoApi.ayncTest();
//第一步获取future对象
HSFFuture future=HSFResponseFuture.getFuture();
futures.add(future);
//继续调用其他业务(同样采取异步调用)
HSFFuture future=HSFResponseFuture.getFuture();
futures.add(future);
// 处理业务
...
//获得数据并做处理
for (HSFFuture hsfFuture : futures) {
String msg=(String) hsfFuture.getResponse(3000);
//处理相应数据
...
}
泛化调用
通过泛化调用可以组合接口、方法、参数进行RPC调用,无需依赖任何业务API。
操作步骤
在消费者配置中加入泛化属性。
<hsf:consumer id="demoApi" interface="com.alibaba.demo.api.DemoApi" group="unittest" generic="true"/>
说明:generic代表泛化参数,true标识支持泛化,false标识不支持,默认为false。
DemoApi接口方法:
public String dealMsg(String msg);
public GenericTestDO dealGenericTestDO(GenericTestDO testDO);
获取demoApi进行强制转换为泛化服务
导入泛化服务接口
import com.alibaba.dubbo.rpc.service.GenericService
获取泛化对象
//若WEB项目中,可通过Spring bean进行注入后强转,这里是单元测试,所以采用加载配置文件方式
ClassPathXmlApplicationContext consumerContext = new ClassPathXmlApplicationContext("hsf-generic-consumer-beans.xml");
GenericService svc = (GenericService) consumerContext.getBean("demoApi");
泛化接口
Object $invoke(String methodName, String[] parameterTypes, Object[] args) throws GenericException;
说明:
methodName:需要调用的方法名称。
parameterTypes:需要调用方法参数的类型。
args:需要传输的参数值。
泛化调用(String类型参数)
svc.$invoke("dealMsg", new String[] { "java.lang.String" }, new Object[] { "hello" })
泛化调用(对象参数)
// 第一步构造实体对象GenericTestDO,该实体有id、name两个属性
GenericTestDO genericTestDO = new GenericTestDO();
genericTestDO.setId(1980l);
genericTestDO.setName("genericTestDO-tst");
// 使用 PojoUtils 生成二方包pojo的描述
Object comp = PojoUtils.generalize(genericTestDO);
// 服务泛化调用
svc.$invoke("dealGenericTestDO",new String[] { "com.alibaba.demo.generic.domain.GenericTestDO" }, new Object[] { comp });
最后更新:2016-11-23 16:04:20
上一篇:
消费者订阅服务__服务开发_开发者指南_企业级分布式应用服务 EDAS-阿里云
下一篇:
HSF 单元测试__服务开发_开发者指南_企业级分布式应用服务 EDAS-阿里云
SELECT__数据操作语言_SQL语法参考_云数据库 OceanBase-阿里云
SMTP之PHP调用示例__SMTP接口说明_邮件推送-阿里云
解绑别名__alias相关_API 列表_OpenAPI 2.0_移动推送-阿里云
实时跟踪__性能监控_用户指南(Linux)_数据管理-阿里云
云服务器 ECS镜像复制FAQ
访问日志__安全管理_快速入门_数据管理-阿里云
DescribeRegions__LoadBalancer相关API_API 参考_负载均衡-阿里云
PhysicalConnectionType__数据类型_API 参考_云服务器 ECS-阿里云
云服务器 ECS 登录 Linux 实例
查询API分组详情__API分组相关接口_API_API 网关-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云