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-阿裏雲