摘要:項(xiàng)目介紹最近在一個(gè)互聯(lián)網(wǎng)跨境支付項(xiàng)目組,所使用的技術(shù)比較老,代碼是寫于年的,整個(gè)系統(tǒng)采用服務(wù)的架構(gòu)模式,連接件使用進(jìn)行同步調(diào)用,使用進(jìn)行異步調(diào)用。言歸正傳,本文主要是講一下,在該項(xiàng)目中的使用。封裝了的功能,便于調(diào)用。主要包括枚舉類和幫助類。
項(xiàng)目介紹
最近在一個(gè)互聯(lián)網(wǎng)跨境支付項(xiàng)目組,所使用的技術(shù)比較老,代碼是寫于2006年的,整個(gè)系統(tǒng)采用服務(wù)的架構(gòu)模式,連接件使用hessian進(jìn)行同步調(diào)用,使用MQ進(jìn)行異步調(diào)用。
跨境系統(tǒng)的服務(wù)分類上,主要有兩類,一類是線上的,比如交易,網(wǎng)關(guān),出金,入金等,一類是線下的,比如對(duì)賬,核算等。這個(gè)分類方法,有點(diǎn)像之前金融市場(chǎng)業(yè)務(wù)功能分成前中后臺(tái)子系統(tǒng)。言歸正傳,本文主要是講一下,hessian在該項(xiàng)目中的使用。
整個(gè)工程分為兩個(gè)WEB模塊:客戶調(diào)用模塊client,服務(wù)處理模塊handler。兩個(gè)基本jar組件:服務(wù)注冊(cè)組件register,hessian工具組件hessianutil.
register : 只有一個(gè)枚舉,用于注冊(cè)服務(wù),一個(gè)服務(wù)一個(gè)枚舉。是不是瞬間感覺低端了。
hessianutil : 提供了hessian操作的工具類套件。之所以將這兩個(gè)分開,是因?yàn)閔essianutil基本不變,而注冊(cè)類就經(jīng)常變動(dòng)了
client : 服務(wù)調(diào)用者
handler : 服務(wù)提供者
public enum SerCode { SIMPLE_CALL_RETURN_STRING("000000","簡(jiǎn)單調(diào)用"), SIMPLE_CALL_RETURN_MAP("000001","返回字典"); private String code; private String desc; SerCode(String code, String desc) { this.code = code; this.desc = desc; } public String getCode() { return code; } public String getDesc() { return desc; } }client:
注意在hessian的service中傳入了handler的服務(wù)調(diào)用地址,hessian會(huì)創(chuàng)建代理,來實(shí)現(xiàn)RPC調(diào)用
public void makeSimpleCall(){ MapparaMap = new HashMap (); String reqMsg = JSonUtil.toJSonString(paraMap); HessianInvokeParam param = HessianInvokeHelper.processRequest(reqMsg); String sysTraceNo = SysTraceNoService .generateSysTraceNo(SystemCodeEnum.WEBGATE.getCode()); String result = clientHessianService.invoke( SerCode.SIMPLE_CALL_RETURN_STRING.getCode(), sysTraceNo, SystemCodeEnum.WEBGATE.getCode(), SystemCodeEnum.TXNCORE.getCode(), SystemCodeEnum.TXNCORE.getVersion(), param.getDataLength(), param.getMsgCompress(), param.getDataMsg()); param.parse(result); HessianInvokeHelper.processResponse(param); result = param.getDataMsg(); System.out.println("result:"+result); }
handler:
public class SimpleHandler implements EventHandler { public String handle(String dataMsg) throws HessianInvokeException { return "this is from simple handler"; } }
contextConfigLocation classpath*:context/**/*.xml org.springframework.web.context.ContextLoaderListener remoting org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath*:remote/**/*.xml remoting /service/*
通過如上配置,客戶端就可以通過訪問http://localhost:8080/handler...和對(duì)應(yīng)的code來訪問handler了。
hessianutil封裝了hessian的功能,便于調(diào)用。里面的類就不一一做介紹了。主要包括枚舉類和幫助類。
//所有handler必須實(shí)現(xiàn)的接口 public interface EventHandler { String handle(String dataMsg) throws HessianInvokeException; }
//hessian調(diào)用時(shí)用的接口 public interface HessianInvokeService { /** * Hessian通訊服務(wù)接口 * * @param serCode * 服務(wù)代碼 * @param sysTraceNo * 系統(tǒng)跟蹤號(hào) * @param originNo * 源系統(tǒng)編號(hào) * @param targetNo * 目的系統(tǒng)編號(hào) * @param versionNo * 接口版本號(hào) 格式:1.0.0 * @param dataLength * 消息正文長(zhǎng)度 * @param msgCompress * 消息正文是否壓縮 * @param dataMsg * 消息正文 * @return */ String invoke(String serCode, String sysTraceNo, String originNo, String targetNo, String versionNo, int dataLength, int msgCompress, String dataMsg); }
//調(diào)用的主要方法類 public class HessianService implements HessianInvokeService { private final Log logger = LogFactory.getLog(HessianService.class); private MapeventHandlerMap; public void setEventHandlerMap(Map eventHandlerMap) { this.eventHandlerMap = eventHandlerMap; } @SuppressWarnings("unchecked") @Override public String invoke(String serCode, String sysTraceNo, String originNo, String targetNo, String versionNo, int dataLength, int msgCompress, String dataMsg) { logger.info("requet auth system:" + "serCode:" + serCode + "sysTraceNo:" + sysTraceNo + "originNo:" + originNo + "targetNo:" + targetNo + "versionNo:" + versionNo); if(logger.isDebugEnabled()){ logger.info("dataMsg:" + dataMsg); } Map result = new HashMap (); try { // 驗(yàn)證請(qǐng)求參數(shù) HessianInvokeHelper.validateReqParam(serCode, sysTraceNo, originNo, targetNo, versionNo, dataLength, msgCompress, dataMsg); // 驗(yàn)證請(qǐng)求服務(wù)代碼是否正確 EventHandler handler = eventHandlerMap.get(serCode); if (handler == null) { throw new HessianInvokeException( ResponseCodeEnum.UNDEFINED_SERVICE.getCode(), ResponseCodeEnum.UNDEFINED_SERVICE.getDesc()); } // 驗(yàn)證目標(biāo)系統(tǒng)編碼 HessianInvokeHelper.validateTargetNo(targetNo, SystemCodeEnum.TXNCORE.getCode()); // 驗(yàn)證請(qǐng)求消息正文內(nèi)容長(zhǎng)度 HessianInvokeHelper.validateDataMsgSize(dataLength, dataMsg); String reqMsg = dataMsg; // 判斷是否需要解壓請(qǐng)求消息正文內(nèi)容 if (msgCompress == 1) { try { reqMsg = ZipUtil.uncompress(dataMsg); } catch (IOException e) { throw new HessianInvokeException( ResponseCodeEnum.UNCOMPRESS_FAILURE.getCode(), ResponseCodeEnum.UNCOMPRESS_FAILURE.getDesc(), e); } } if(logger.isDebugEnabled()){ logger.info("reqMsg:" + reqMsg); } Map map = JSonUtil.toObject(reqMsg, Map.class); map.put("sysTraceNo", sysTraceNo); String rsp = handler.handle(JSonUtil.toJSonString(map)); return HessianInvokeHelper.buildResponse(serCode, sysTraceNo, SystemCodeEnum.TXNCORE.getCode(), originNo, versionNo, rsp); } catch (Exception e) { logger.error(e.getMessage(), e); logger.error(e.getMessage(), e); result.put("responseCode", ResponseCodeEnum.UNDEFINED_ERROR.getCode()); result.put("responseDesc", ResponseCodeEnum.UNDEFINED_ERROR.getDesc()); } return HessianInvokeHelper.buildResponse(serCode, sysTraceNo, SystemCodeEnum.TXNCORE.getCode(), originNo, versionNo, JSonUtil.toJSonString(result)); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70261.html
摘要:相比,更簡(jiǎn)單快捷。采用的是二進(jìn)制協(xié)議,因?yàn)椴捎玫氖嵌M(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。創(chuàng)建接口創(chuàng)建實(shí)現(xiàn)類類端在這個(gè)包下服務(wù)端包類將服務(wù)端的代碼打包安裝到本地倉(cāng)庫(kù),打開瀏覽器輸入即可。 前言 看了其他的文章發(fā)現(xiàn),大多數(shù)都是只寫了關(guān)鍵的部分,對(duì)于一個(gè)初學(xué)者來說只能明白用了什么東西,但實(shí)際動(dòng)手發(fā)現(xiàn),項(xiàng)目還存在一些問題,通過本篇文章,可以避免一些問題,節(jié)省一些時(shí)間成本。 Hessian簡(jiǎn)...
摘要:當(dāng)提供程序線程池耗盡時(shí),不能發(fā)送到使用者端。一些錯(cuò)誤修正動(dòng)態(tài)配置不能刪除,支持參數(shù),監(jiān)控統(tǒng)計(jì)問題等新功能支持手冊(cè)線程池耗盡時(shí)自動(dòng)堆棧轉(zhuǎn)儲(chǔ)。在注冊(cè)表無法連接時(shí)被阻止。正常關(guān)機(jī),在注冊(cè)表取消注冊(cè)和線程池關(guān)閉之間增加額外的等待時(shí)間。 dubbo分析showImg(https://segmentfault.com/img/bVbam2f?w=1726&h=686); dubbo為什么要對(duì)接sp...
摘要:最近公司內(nèi)部系統(tǒng)相互通信調(diào)用用到了的機(jī)制后來有空研究了一下的機(jī)制在這里做一個(gè)簡(jiǎn)單的摘要有不對(duì)的地方希望指正首先看客戶端的基礎(chǔ)類他是一個(gè)工廠意味著他具有包裝的功能當(dāng)你調(diào)用的的的方法返回的并不是他本身而是被他包裝過得下圖的箭頭及包裝的地方實(shí)際上 最近公司內(nèi)部系統(tǒng)相互通信調(diào)用用到了spring的hessian機(jī)制,后來有空研究了一下spring hessian的機(jī)制,在這里做一個(gè)簡(jiǎn)單的摘要,...
摘要:但是只不過都是以二進(jìn)制的形式編碼的。這其實(shí)相當(dāng)于綜合了和二進(jìn)制共同優(yōu)勢(shì)的一個(gè)協(xié)議。在上面的架構(gòu)中,如果使用二進(jìn)制的方式進(jìn)行序列化,雖然不用協(xié)議文件來生成,但是對(duì)于接口的定義,以及傳的對(duì)象,還是需要共享。 ????前面我們認(rèn)識(shí)了兩個(gè)常用文本類的 RPC 協(xié)議,對(duì)于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語(yǔ),會(huì)使得協(xié)議約定非常不方便。 ????在講 CDN 和 DNS 的時(shí)候,我們...
摘要:但是只不過都是以二進(jìn)制的形式編碼的。這其實(shí)相當(dāng)于綜合了和二進(jìn)制共同優(yōu)勢(shì)的一個(gè)協(xié)議。在上面的架構(gòu)中,如果使用二進(jìn)制的方式進(jìn)行序列化,雖然不用協(xié)議文件來生成,但是對(duì)于接口的定義,以及傳的對(duì)象,還是需要共享。 ????前面我們認(rèn)識(shí)了兩個(gè)常用文本類的 RPC 協(xié)議,對(duì)于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語(yǔ),會(huì)使得協(xié)議約定非常不方便。 ????在講 CDN 和 DNS 的時(shí)候,我們...
閱讀 3557·2021-08-02 13:41
閱讀 2391·2019-08-30 15:56
閱讀 1520·2019-08-30 11:17
閱讀 1174·2019-08-29 15:18
閱讀 580·2019-08-29 11:10
閱讀 2671·2019-08-26 13:52
閱讀 508·2019-08-26 13:22
閱讀 2949·2019-08-23 15:41