亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Hessian在實際項目中的使用

shuibo / 656人閱讀

摘要:項目介紹最近在一個互聯(lián)網(wǎng)跨境支付項目組,所使用的技術(shù)比較老,代碼是寫于年的,整個系統(tǒng)采用服務(wù)的架構(gòu)模式,連接件使用進行同步調(diào)用,使用進行異步調(diào)用。言歸正傳,本文主要是講一下,在該項目中的使用。封裝了的功能,便于調(diào)用。主要包括枚舉類和幫助類。

項目介紹

最近在一個互聯(lián)網(wǎng)跨境支付項目組,所使用的技術(shù)比較老,代碼是寫于2006年的,整個系統(tǒng)采用服務(wù)的架構(gòu)模式,連接件使用hessian進行同步調(diào)用,使用MQ進行異步調(diào)用。
跨境系統(tǒng)的服務(wù)分類上,主要有兩類,一類是線上的,比如交易,網(wǎng)關(guān),出金,入金等,一類是線下的,比如對賬,核算等。這個分類方法,有點像之前金融市場業(yè)務(wù)功能分成前中后臺子系統(tǒng)。言歸正傳,本文主要是講一下,hessian在該項目中的使用。

劃分模塊

整個工程分為兩個WEB模塊:客戶調(diào)用模塊client,服務(wù)處理模塊handler。兩個基本jar組件:服務(wù)注冊組件register,hessian工具組件hessianutil.

register : 只有一個枚舉,用于注冊服務(wù),一個服務(wù)一個枚舉。是不是瞬間感覺低端了。
hessianutil : 提供了hessian操作的工具類套件。之所以將這兩個分開,是因為hessianutil基本不變,而注冊類就經(jīng)常變動了
client : 服務(wù)調(diào)用者
handler : 服務(wù)提供者

代碼 register:
public enum SerCode {
    SIMPLE_CALL_RETURN_STRING("000000","簡單調(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會創(chuàng)建代理,來實現(xiàn)RPC調(diào)用

public void makeSimpleCall(){
        Map paraMap = 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...和對應(yīng)的code來訪問handler了。

hessianutil

封裝了hessian的功能,便于調(diào)用。里面的類就不一一做介紹了。主要包括枚舉類和幫助類。

//所有handler必須實現(xiàn)的接口
public interface EventHandler {
    String handle(String dataMsg) throws HessianInvokeException;
}
//hessian調(diào)用時用的接口
public interface HessianInvokeService {
    /**
     * Hessian通訊服務(wù)接口
     *
     * @param serCode
     *            服務(wù)代碼
     * @param sysTraceNo
     *            系統(tǒng)跟蹤號
     * @param originNo
     *            源系統(tǒng)編號
     * @param targetNo
     *            目的系統(tǒng)編號
     * @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);

}
//調(diào)用的主要方法類
public class HessianService implements HessianInvokeService {

    private final Log logger = LogFactory.getLog(HessianService.class);
    private Map eventHandlerMap;
    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 {

            // 驗證請求參數(shù)
            HessianInvokeHelper.validateReqParam(serCode, sysTraceNo, originNo,
                    targetNo, versionNo, dataLength, msgCompress, dataMsg);

            // 驗證請求服務(wù)代碼是否正確
            EventHandler handler = eventHandlerMap.get(serCode);
            if (handler == null) {
                throw new HessianInvokeException(
                        ResponseCodeEnum.UNDEFINED_SERVICE.getCode(),
                        ResponseCodeEnum.UNDEFINED_SERVICE.getDesc());
            }

            // 驗證目標系統(tǒng)編碼
            HessianInvokeHelper.validateTargetNo(targetNo,
                    SystemCodeEnum.TXNCORE.getCode());

            // 驗證請求消息正文內(nèi)容長度
            HessianInvokeHelper.validateDataMsgSize(dataLength, dataMsg);

            String reqMsg = dataMsg;
            // 判斷是否需要解壓請求消息正文內(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/70261.html

相關(guān)文章

  • Spring Boot整合hessian入門

    摘要:相比,更簡單快捷。采用的是二進制協(xié)議,因為采用的是二進制協(xié)議,所以它很適合于發(fā)送二進制數(shù)據(jù)。創(chuàng)建接口創(chuàng)建實現(xiàn)類類端在這個包下服務(wù)端包類將服務(wù)端的代碼打包安裝到本地倉庫,打開瀏覽器輸入即可。 前言 看了其他的文章發(fā)現(xiàn),大多數(shù)都是只寫了關(guān)鍵的部分,對于一個初學(xué)者來說只能明白用了什么東西,但實際動手發(fā)現(xiàn),項目還存在一些問題,通過本篇文章,可以避免一些問題,節(jié)省一些時間成本。 Hessian簡...

    wujl596 評論0 收藏0
  • dubbo個人理解于應(yīng)用章(二)

    摘要:當(dāng)提供程序線程池耗盡時,不能發(fā)送到使用者端。一些錯誤修正動態(tài)配置不能刪除,支持參數(shù),監(jiān)控統(tǒng)計問題等新功能支持手冊線程池耗盡時自動堆棧轉(zhuǎn)儲。在注冊表無法連接時被阻止。正常關(guān)機,在注冊表取消注冊和線程池關(guān)閉之間增加額外的等待時間。 dubbo分析showImg(https://segmentfault.com/img/bVbam2f?w=1726&h=686); dubbo為什么要對接sp...

    AlphaWallet 評論0 收藏0
  • Spring Hessian調(diào)用端代碼淺析

    摘要:最近公司內(nèi)部系統(tǒng)相互通信調(diào)用用到了的機制后來有空研究了一下的機制在這里做一個簡單的摘要有不對的地方希望指正首先看客戶端的基礎(chǔ)類他是一個工廠意味著他具有包裝的功能當(dāng)你調(diào)用的的的方法返回的并不是他本身而是被他包裝過得下圖的箭頭及包裝的地方實際上 最近公司內(nèi)部系統(tǒng)相互通信調(diào)用用到了spring的hessian機制,后來有空研究了一下spring hessian的機制,在這里做一個簡單的摘要,...

    jzman 評論0 收藏0
  • 網(wǎng)絡(luò)協(xié)議 22 - RPC 協(xié)議(下)- 二進制類 RPC 協(xié)議

    摘要:但是只不過都是以二進制的形式編碼的。這其實相當(dāng)于綜合了和二進制共同優(yōu)勢的一個協(xié)議。在上面的架構(gòu)中,如果使用二進制的方式進行序列化,雖然不用協(xié)議文件來生成,但是對于接口的定義,以及傳的對象,還是需要共享。 ????前面我們認識了兩個常用文本類的 RPC 協(xié)議,對于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語,會使得協(xié)議約定非常不方便。 ????在講 CDN 和 DNS 的時候,我們...

    付倫 評論0 收藏0
  • 網(wǎng)絡(luò)協(xié)議 22 - RPC 協(xié)議(下)- 二進制類 RPC 協(xié)議

    摘要:但是只不過都是以二進制的形式編碼的。這其實相當(dāng)于綜合了和二進制共同優(yōu)勢的一個協(xié)議。在上面的架構(gòu)中,如果使用二進制的方式進行序列化,雖然不用協(xié)議文件來生成,但是對于接口的定義,以及傳的對象,還是需要共享。 ????前面我們認識了兩個常用文本類的 RPC 協(xié)議,對于陌生人之間的溝通,用 NBA、CBA 這樣的縮略語,會使得協(xié)議約定非常不方便。 ????在講 CDN 和 DNS 的時候,我們...

    wing324 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<