jsonrpc4j在Java項目間通信實例講解【轟隆隆原創】

技術介紹

json-rpc是基於json的跨語言遠程調用協議,比xml-rpc、webservice等基於文本的協議傳輸數據格小;相對hessian、java-rpc等二進制協議便於調試、實現、擴展,是很是優秀的一種遠程調用協議。目前主流語言都已有json-rpc的實現框架,java語言中較好的json-rpc實現框架有jsonrpc4j、jpoxy、json-rpc。三者之中jsonrpc4j既可獨立使用,又可與spring無縫集合,比較適合於基於spring的項目開發。本文將介紹jsonrpc4j的具體使用。jsonrpc4j爲開源項目,源代碼和JAR包在網上均可如下載到,爲了不廣告嫌疑故略去。java

Java服務端配置

web.xml 中添加web

<servlet>
    <servlet-name>JsonRpcServerServlet</servlet-name>
    <servlet-class>com.service.jsonrequest.ServiceJsonRpcServlet</servlet-class>
    <load-on-startup>10</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>JsonRpcServerServlet</servlet-name>
    <url-pattern>/json-Rpc</url-pattern>
  </servlet-mapping>

此處配置的/json-Rpc爲客戶端請求訪問地址。spring

ServiceJsonRpcServlet的servletsql

private JsonRpcServer rpcService = null; 
    public void init(ServletConfig config) throws ServletException {
        super.init(config); 
       rpcService = new JsonRpcServer(new ReceiveChannel(), ReceiveChannel.class); 
    }

此處的ReceiveChannel類就是將向客戶端展示的類。在service方法中能夠對客戶端的請求頭進行預驗證json

protected void service(HttpServletRequest req, HttpServletResponse resp){
    String UserKey = req.getHeader("UserKey");
  //在此能夠驗證客戶端的請求,前提是客戶端須要在請求頭中加入相應的值,我在後面在講。
}

接下來咱們看ReceiveChannel的實現,ReceiveChannel裏面的方法是能夠被客戶端所能調用的,方法的返回對象是能夠被客戶端所接收到的,返回的類型能夠在客戶端進行定義,能夠是String,List,int,甚至能夠是Java bean對象或者json格式。對於方法的傳參,在客戶端調用的時候須要設置,如下我以例子爲你們講解數組

public List<HashMap<String,Object>> publicQuery(String key1,String key2,String sql) throws Exception{
    //在進行業務邏輯處理前,能夠對傳遞過來的參數進行合法性驗證。
    //有必要的狀況下能夠對參數進行加密,並在這裏解密。
    List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();
    HashMap<String,Object> hm = new LinkedHashMap<String,Object>();
    hm.put("網站名稱","轟隆隆小站");
    hm.put("網站地址","http://www.honglonglong.com");
    list.add(hm);
 return list;
}

Java客戶端調用

public List<LinkedHashMap<String,Object>> getQueryMap(String sql){
        List<LinkedHashMap<String,Object>> list = new ArrayList<LinkedHashMap<String,Object>>();
        JsonRpcHttpClient client;
        try {
            //實例化請求地址,注意服務端web.xml中地址的配置
            client = new JsonRpcHttpClient(new URL("http://127.0.0.1:8080/json-Rpc"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return list;
        }

        //請求頭中添加的信息
        Map<String,String> headers = new HashMap<String,String>();
        headers.put("UserKey", "www.honglonglong.com");
        //添加到請求頭中去
        client.setHeaders(headers);
        try {
            //將請求參數封裝爲數組(注:服務端publicQuery方法的參數個數)
            String [] send =new String[3];
            send[0]="我是轟隆隆";
            send[1]="轟隆隆是我";
            send[2]=sql;
            long x1=System.currentTimeMillis();
            //此處就是向服務端獲取數據。publicQuery就是ReceiveChannel對外公開的方法。
            list = client.invokes("publicQuery",send);
            System.out.println("請求時間:"+ (System.currentTimeMillis()-x1)+"毫秒,返回記錄數:"+list.size()+"條,SQL:"+sql);
            return list;
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        }
    }

接下來咱們看一下JsonRpcHttpClient的invokes方法寫法app

@SuppressWarnings("unchecked")
    public <T> T invokes(String methodName, Object argument)throws Throwable {
        return (T)invoke(methodName, argument,Type.class.cast(List.class));
    }

其中的invoke方法是JsonRpcHttpClient類的原始方法,能夠不做處理。框架

至此,整個請求流程結束,各位能夠試着運行,有問題能夠隨時覓我,本人轟隆隆-小站歡迎你們光臨。網站

由於時間倉促,文章不免有紕漏和不足之處,敬請各位大俠斧正。加密

轉貼請註明轟隆隆-小站

相關文章
相關標籤/搜索