微博Motan中的transport模組一些點
首先看一段程式碼
nettyClient = new NettyClient(url); nettyClient.open(); RpcContext.getContext().putAttribute(MotanConstants.ASYNC_SUFFIX, true); Response response; try { response = nettyClient.request(request); Assert.assertTrue(response instanceof ResponseFuture); Object result = response.getValue();//獲取返回結果會阻塞 RpcContext.destroy(); Assert.assertNotNull(result); Assert.assertEquals("method: " + request.getMethodName() + " requestId: " + request.getRequestId(), result); } catch (MotanServiceException e) { e.printStackTrace(); assertTrue(false); } catch (Exception e) { e.printStackTrace(); assertTrue(false); }
主要是建立一個客戶端的連線,傳送請求,然後獲取返回。
nettyClient.open(); open的時候會去建立一個channel的連線池,可以點進去看 所以當呼叫request的時候最終會走到這樣一個方法 private Response request(Request request, boolean async) throws TransportException { Channel channel; Response response; try { channel = getChannel();//從連線池獲取channel if (channel == null) { LoggerUtil.error("NettyClient borrowObject null: url=" + url.getUri() + " " + MotanFrameworkUtil.toString(request)); return null; } // async request response = channel.request(request); } catch (Exception e) { } // aysnc or sync result response = asyncResponse(response, async); return response; } 最終發起呼叫是在com.weibo.api.motan.transport.netty4.NettyChannel中的request方法 @Override public Response request(Request request) throws TransportException { int timeout = nettyClient.getUrl().getMethodParameter(request.getMethodName(), request.getParamtersDesc(), URLParamType.requestTimeout.getName(), URLParamType.requestTimeout.getIntValue()); if (timeout
當服務端返回資料後會呼叫處理返回的handler
com.weibo.api.motan.transport.netty4.NettyClient中的handler new MessageHandler() { @Override public Object handle(Channel channel, Object message) { Response response = (Response) message; System.out.println("獲取到message"); ResponseFuture responseFuture = NettyClient.this.removeCallback(response.getRequestId()); if (responseFuture == null) { LoggerUtil.warn("NettyClient has response from server, but responseFuture not exist, requestId={}", response.getRequestId()); return null; } if (response.getException() != null) { responseFuture.onFailure(response); } else { responseFuture.onSuccess(response); } return null; } } 可以看到如果服務端返回了,就會獲取到響應的DefaultResponse 然後將返回結果傳入到之前構建的responseFuture if (response.getException() != null) { responseFuture.onFailure(response); } else { responseFuture.onSuccess(response); } onSuccess中會呼叫之前的listener,執行listen回撥方法關於
DefaultResponseFuture 透過物件鎖protected Object lock = new Object();來保證等待結果的返回 獲取返回結果會阻塞,如果服務端還沒有返回 Object result = response.getValue();//獲取返回結果會阻塞 @Override public Object getValue() { System.out.println("getValue"); synchronized (lock) { if (!isDoing()) { return getValueOrThrowable();//如果不是在執行就報錯 } System.out.println("timeout:"+timeout); if (timeout 0) { for (; ; ) { try { lock.wait(waitTime); } catch (InterruptedException e) { } if (!isDoing()) { break; } else { waitTime = timeout - (System.currentTimeMillis() - createTime); if (waitTime
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1747/viewspace-2812489/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微博地址:http://weibo.com/longchun 一些新的技術和想法將在微博中釋出HTTPGC
- spring+motan+zookeeper入門Spring
- RPC 使用中的一些注意點RPC
- Java中類的一些知識點Java
- 模組化的一些小研究
- PP模組的一些概念
- node中事件(events)模組一些用法和原理事件
- 微博應用開發的那點事
- DIM中的一些知識點(慢更)
- JavaScript中的模組匯入有一個缺點JavaScript
- 聊聊中後臺前端應用:模組相關的一些事前端
- 盤點 ES12 中的一些新特性!
- java中的介面一些知識點———— 程式碼Java
- vscode中隱藏節點模組的外掛VSCode
- mongodb核心transport_layer網路傳輸層模組原始碼實現三MongoDB原始碼
- mongodb核心transport_layer 網路傳輸層模組原始碼實現四MongoDB原始碼
- FreeSwitch一些模組的安裝
- TRANSPORT TABLESPACE總結
- Perl的一些重要模組使用介紹
- javascript中的一些核心知識點以及需要注意的地方JavaScript
- Transport of Tablespaces Between Databases (59)Database
- Python中的模組--SSH相關模組Python
- 智慧卡模組所用條帶的一些趣事
- 關於分銷模組的一些記錄
- 你不可錯過的光模組中的鐳射器型別大盤點!型別
- 直播系統開發過程中的一些關鍵點
- 防火牆設計中的一些重點問題(2)(轉)防火牆
- 防火牆設計中的一些重點問題(1)(轉)防火牆
- JavaScript 中的模組化JavaScript
- 【SaltStack】一些常用模組舉例
- 資料分析在微博營銷中的應用
- LoRa模組在智慧灌溉系統中的應用特點介紹
- SQL Server 2005中的tempdb資料庫的一些特點SQLServer資料庫
- 一些點雲的小知識,從官方文件中發現的例子
- mysql的一些知識點MySql
- CGI的一些知識點
- Jquery的一些知識點jQuery
- meminfo一些容易混淆的點