摘要:項目介紹最近在一個互聯網跨境支付項目組,所使用的技術比較老,代碼是寫于年的,整個系統采用服務的架構模式,連接件使用進行同步調用,使用進行異步調用。言歸正傳,本文主要是講一下,在該項目中的使用。封裝了的功能,便于調用。主要包括枚舉類和幫助類。
項目介紹
最近在一個互聯網跨境支付項目組,所使用的技術比較老,代碼是寫于2006年的,整個系統采用服務的架構模式,連接件使用hessian進行同步調用,使用MQ進行異步調用。
跨境系統的服務分類上,主要有兩類,一類是線上的,比如交易,網關,出金,入金等,一類是線下的,比如對賬,核算等。這個分類方法,有點像之前金融市場業務功能分成前中后臺子系統。言歸正傳,本文主要是講一下,hessian在該項目中的使用。
整個工程分為兩個WEB模塊:客戶調用模塊client,服務處理模塊handler。兩個基本jar組件:服務注冊組件register,hessian工具組件hessianutil.
register : 只有一個枚舉,用于注冊服務,一個服務一個枚舉。是不是瞬間感覺低端了。
hessianutil : 提供了hessian操作的工具類套件。之所以將這兩個分開,是因為hessianutil基本不變,而注冊類就經常變動了
client : 服務調用者
handler : 服務提供者
public enum SerCode { SIMPLE_CALL_RETURN_STRING("000000","簡單調用"), 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的服務調用地址,hessian會創建代理,來實現RPC調用
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...和對應的code來訪問handler了。
hessianutil封裝了hessian的功能,便于調用。里面的類就不一一做介紹了。主要包括枚舉類和幫助類。
//所有handler必須實現的接口 public interface EventHandler { String handle(String dataMsg) throws HessianInvokeException; }
//hessian調用時用的接口 public interface HessianInvokeService { /** * Hessian通訊服務接口 * * @param serCode * 服務代碼 * @param sysTraceNo * 系統跟蹤號 * @param originNo * 源系統編號 * @param targetNo * 目的系統編號 * @param versionNo * 接口版本號 格式:1.0.0 * @param dataLength * 消息正文長度 * @param msgCompress * 消息正文是否壓縮 * @param dataMsg * 消息正文 * @return */ String invoke(String serCode, String sysTraceNo, String originNo, String targetNo, String versionNo, int dataLength, int msgCompress, String dataMsg); }
//調用的主要方法類 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 { // 驗證請求參數 HessianInvokeHelper.validateReqParam(serCode, sysTraceNo, originNo, targetNo, versionNo, dataLength, msgCompress, dataMsg); // 驗證請求服務代碼是否正確 EventHandler handler = eventHandlerMap.get(serCode); if (handler == null) { throw new HessianInvokeException( ResponseCodeEnum.UNDEFINED_SERVICE.getCode(), ResponseCodeEnum.UNDEFINED_SERVICE.getDesc()); } // 驗證目標系統編碼 HessianInvokeHelper.validateTargetNo(targetNo, SystemCodeEnum.TXNCORE.getCode()); // 驗證請求消息正文內容長度 HessianInvokeHelper.validateDataMsgSize(dataLength, dataMsg); String reqMsg = dataMsg; // 判斷是否需要解壓請求消息正文內容 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)); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70261.html
摘要:相比,更簡單快捷。采用的是二進制協議,因為采用的是二進制協議,所以它很適合于發送二進制數據。創建接口創建實現類類端在這個包下服務端包類將服務端的代碼打包安裝到本地倉庫,打開瀏覽器輸入即可。 前言 看了其他的文章發現,大多數都是只寫了關鍵的部分,對于一個初學者來說只能明白用了什么東西,但實際動手發現,項目還存在一些問題,通過本篇文章,可以避免一些問題,節省一些時間成本。 Hessian簡...
摘要:當提供程序線程池耗盡時,不能發送到使用者端。一些錯誤修正動態配置不能刪除,支持參數,監控統計問題等新功能支持手冊線程池耗盡時自動堆棧轉儲。在注冊表無法連接時被阻止。正常關機,在注冊表取消注冊和線程池關閉之間增加額外的等待時間。 dubbo分析showImg(https://segmentfault.com/img/bVbam2f?w=1726&h=686); dubbo為什么要對接sp...
摘要:最近公司內部系統相互通信調用用到了的機制后來有空研究了一下的機制在這里做一個簡單的摘要有不對的地方希望指正首先看客戶端的基礎類他是一個工廠意味著他具有包裝的功能當你調用的的的方法返回的并不是他本身而是被他包裝過得下圖的箭頭及包裝的地方實際上 最近公司內部系統相互通信調用用到了spring的hessian機制,后來有空研究了一下spring hessian的機制,在這里做一個簡單的摘要,...
摘要:但是只不過都是以二進制的形式編碼的。這其實相當于綜合了和二進制共同優勢的一個協議。在上面的架構中,如果使用二進制的方式進行序列化,雖然不用協議文件來生成,但是對于接口的定義,以及傳的對象,還是需要共享。 ????前面我們認識了兩個常用文本類的 RPC 協議,對于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語,會使得協議約定非常不方便。 ????在講 CDN 和 DNS 的時候,我們...
摘要:但是只不過都是以二進制的形式編碼的。這其實相當于綜合了和二進制共同優勢的一個協議。在上面的架構中,如果使用二進制的方式進行序列化,雖然不用協議文件來生成,但是對于接口的定義,以及傳的對象,還是需要共享。 ????前面我們認識了兩個常用文本類的 RPC 協議,對于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語,會使得協議約定非常不方便。 ????在講 CDN 和 DNS 的時候,我們...
閱讀 3569·2021-08-02 13:41
閱讀 2431·2019-08-30 15:56
閱讀 1526·2019-08-30 11:17
閱讀 1182·2019-08-29 15:18
閱讀 585·2019-08-29 11:10
閱讀 2680·2019-08-26 13:52
閱讀 516·2019-08-26 13:22
閱讀 2960·2019-08-23 15:41